如何在swift中使用现有的SQLite数据库?

Bis*_*han 1 database sqlite xcode ios swift

我知道有一些资源可用于此,但它们都没有清楚地说明如何正确地做到这一点.

我已经填充了.sqlite数据库(MTrader.db),我想将它连接到我的swift项目并将数据从数据库加载到微调器中.

我尝试了很多方法,但它不起作用.我尝试编辑 lazy var persistentStoreCoordinator:NSPersistentStoreCoordinator? AppDelegete.swift中的方法为

if !NSFileManager.defaultManager().fileExistsAtPath(url.path!) {
            let sourceSqliteURLs = [NSBundle.mainBundle().URLForResource("MTrader", withExtension: "db")!]

            let destSqliteURLs = [self.applicationDocumentsDirectory.URLByAppendingPathComponent("MTrader.db")]

            var error:NSError? = nil
            for var index = 0; index < sourceSqliteURLs.count; index++ {
                NSFileManager.defaultManager().copyItemAtURL(sourceSqliteURLs[index], toURL: destSqliteURLs[index], error: &error)
            }
        }
Run Code Online (Sandbox Code Playgroud)

出于某种原因,上面的代码无效.我在项目中复制了我的数据库文件.那么我的代码是否有任何错误或更好的方法来使用我现有的数据库而无需创建新的数据库并填充它?

Bad*_*Cat 6

首先将libsqlite3.dylib添加到您的Xcode项目中(在项目设置/构建阶段/链接二进制文件库中),然后使用类似fmdb的东西,它使得处理SQLite变得更加容易.它是用Objective-C编写的,但也可以在Swift项目中使用.

然后你可以写一个DatabaseManager类,例如......

import Foundation;

class DatabaseManager {

    private let dbFileName = "database.db"
    private var database:FMDatabase!

    init() {
        openDatabase()
    }

    func openDatabase() {
        let resourcePath = NSBundle.mainBundle().resourceURL!.absoluteString
        let dbPath = resourcePath?.stringByAppendingPathComponent(dbFileName)
        let database = FMDatabase(path: dbPath)

        /* Open database read-only. */
        if (!database.openWithFlags(1)) {
            println("Could not open database at \(dbPath).")
        } else {
            self.database = database;
        }
    }

    func closeDatabase() {
        if (database != nil) {
            database.close()
        }
    }

    func query(queryString:String) {
        if let db = database, q = db.executeQuery(queryString, withArgumentsInArray: nil) {
            while q.next() {
                let data = q.stringForColumn("columnName")
                // Do whatever here with fetched data, usually add it to an array and return that array
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)