我有以下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
}
我在我的应用程序委托中调用这个函数,以为它会成功创建我的数据库一次(而且只有一次)。每当我清除设置并运行它时,它总是会碰到我标记(错误)的区域一次。在再次运行它之后,我再也没有遇到过这个错误。
这段代码中是否有一些逻辑缺陷(我大部分时间都是复制这段代码的),或者我是否报告了一个实际上没有的错误?我怀疑它可能只是在第一次创建时发生的,但我实际上很好,可以很好地开始与数据库交互。
还有人在代码中看到相关内容吗?
谢谢!
好吧,在没有真正弄清楚为什么上面从在线教程中拼凑而来的代码会像我所描述的那样之后,我在这里找到了一篇非常有用的文章:
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
}