Ios SQLLite错误-无法打开数据库
我有以下sqllite代码:Ios SQLLite错误-无法打开数据库,ios,swift,ios8,xcode6,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,
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 delegate中调用这个函数,以为它会成功地创建我的数据库一次(而且只有一次)。每当我清除设置并运行它时,它总是命中我标记(错误)的区域一次。在再次运行之后,我再也不会出现这个错误了
这段代码中是否存在一些逻辑缺陷(我主要是复制了这段代码),或者我是否报告了一个实际上不存在的错误?我怀疑它可能只是在第一次创建时发生的,但实际上我很好,可以很好地开始与数据库交互
还有人在代码中看到了一些相关的东西吗
谢谢 好吧,在没有真正弄清楚为什么上面的代码是从在线教程中拼凑而成的之后,我在这里找到了一篇非常有用的文章:
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
}
这不是一个实际的答案。如果你真的发布了代码修复而不是链接,那会更有帮助。