SQLite错误 - 无法打开数据库

时间:2014-09-22 00:59:14

标签: ios swift ios8 xcode6

我有以下sqllite代码:

func createAndCheckDatabase()-> Bool
{
    var success: Bool = true

    var db:COpaquePointer = nil        // Get path to DB in Documents directory
    let docDir:AnyObject = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]

    let path = docDir.stringByAppendingPathComponent("MyDatabase.db")
    // Check if copy of DB is there in Documents directory
    let fm = NSFileManager.defaultManager()
    if !(fm.fileExistsAtPath(path)) {
        // The database does not exist, so copy to Documents directory
        let from = NSBundle.mainBundle().resourcePath!.stringByAppendingPathComponent(databaseName)
        var error:NSError?
        if !fm.copyItemAtPath(from, toPath: path, error: &error) {
            //ALWAYS ERRORS HERE THE FIRST TIME
            println("SQLiteDB - #1 failed to open DB.")
            println("Error - \(error!.localizedDescription)")
        }
    }

    databasePath = path
    // Open the DB
    let cpath = (path as NSString).UTF8String
    let error = sqlite3_open(cpath, &db)
    if error != SQLITE_OK {
        // Open failed, close DB and fail
        println("SQLiteDB - another error - couldn't open DB")
        sqlite3_close(db)
    }

    return success
}

我在我的app委托中调用此函数,并认为它将成功创建我的数据库一次(并且只有一次)。每当我清除设置并运行它时,它总是会击中我标记过的区域(错误)一次。再次运行后,我再也不会收到此错误。

此代码中是否存在一些逻辑缺陷(我主要复制此代码)或者我是否报告了实际上没有的错误?我怀疑它可能只是在第一次创建时发生,但我实际上没问题,可以开始与数据库进行良好的交互。

也有人在代码中看到了一些问题吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,在没有真正弄清楚为什么上面的代码拼凑起来就像我描述的在线教程一样,我在这里找到了一篇非常有用的文章:

 http://metrozines.com

这最终解决了我的问题(通过他们如何做事并介绍教程中的代码)。现在当我清除设置时,它不会崩溃并且再次启动它可以正常工作而不会抛出错误。

现在可以使用的代码是:

func createAndCheckDatabase() -> Bool {
    let DATABASE_RESOURCE_NAME = "abc"
    let DATABASE_RESOURCE_TYPE = "sqlite"
    let DATABASE_FILE_NAME = "abc.sqlite"
    let documentFolderPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String

    let dbfile = "/" + DATABASE_FILE_NAME;

    self.dbFilePath = documentFolderPath.stringByAppendingString(dbfile)

    let filemanager = NSFileManager.defaultManager()
    if (!filemanager.fileExistsAtPath(dbFilePath) ) {

        let backupDbPath = NSBundle.mainBundle().pathForResource(DATABASE_RESOURCE_NAME, ofType: DATABASE_RESOURCE_TYPE)

        if (backupDbPath == nil) {
            return false
        } else {
            var error: NSError?
            let copySuccessful = filemanager.copyItemAtPath(backupDbPath!, toPath:dbFilePath, error: &error)
            if !copySuccessful {
                println("copy failed: \(error?.localizedDescription)")
                return false
            }

        }

    }

    return true

}