Swift3 sqlite3_open()打开一个现有文件
let file_url = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor:nil,create: false).appendingPathComponent("asd.db") var db:OpaquePointer? = nil if sqlite3_open(file_url.path, &db) == SQLITE_OK { print("Successfully opened connection database!!") var q:OpaquePointer? = nil if sqlite3_prepare_v2(db, "SELECT * FROM aaa", -1, &q, nil) == SQLITE_OK { if sqlite3_step(q) == SQLITE_ROW { let res = sqlite3_column_text(q, 1) let name = String(cString: res!) } else { print("ERROR1!!!!!") } } else { print("ERROR!2!!!!") } }
我在proejct中有一个名为“asd.db”的数据库文件,我正在尝试打开并从数据库中读取数据。
我不知道为什么但sqlite3_open无法找到我的数据库文件,所以它创建了一个没有我的表的新文件。
我该如何解决?
-
如果您不希望SQLite创建新数据库,请使用
sqlite3_open_v2
(使用SQLITE_OPEN_READWRITE
,但不使用SQLITE_OPEN_CREATE
选项)而不是sqlite3_open
。 -
如果您运行应用程序一次,并且文档文件夹中有一个空白数据库,请删除该应用程序并重新安装以删除该空白数据库。
-
如果您在“项目中”包含了一个数据库(假设您已将其添加到相关目标中),那么这意味着将在您的包中找到该数据库。
标准过程是编写例程以查看数据库是否存在于文档文件夹中,如果不存在,则在尝试从文档文件夹中打开它之前,将其从包中复制到文档文件夹。
或者,或者,只需尝试在文档文件夹中打开它,如果由于找不到文件而失败,请将其从包中复制到文档文件夹,然后重试。 例如:
var db:OpaquePointer? = nil /// Open database /// /// - returns: Return `true` if successful; return `false` on error. func openDatabase() -> Bool { do { let manager = FileManager.default let documentsURL = try manager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("asd.db") var rc = sqlite3_open_v2(documentsURL.path, &db, SQLITE_OPEN_READWRITE, nil) if rc == SQLITE_CANTOPEN { let bundleURL = Bundle.main.url(forResource: "asd", withExtension: "db")! try manager.copyItem(at: bundleURL, to: documentsURL) rc = sqlite3_open_v2(documentsURL.path, &db, SQLITE_OPEN_READWRITE, nil) } if rc != SQLITE_OK { print("Error: \(rc)") return false } return true } catch { print(error) return false } }