Swift3 sqlite3_open()打开一个现有文件

时间:2016-10-05 09:19:08

标签: ios database swift sqlite

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无法找到我的数据库文件,所以它创建了一个没有我的表的新文件。

我该如何解决?

1 个答案:

答案 0 :(得分:5)

  1. 如果您不希望SQLite创建新数据库,请使用sqlite3_open_v2(使用SQLITE_OPEN_READWRITE,但不使用SQLITE_OPEN_CREATE选项)而不是sqlite3_open

  2. 如果您运行应用程序一次并且文档文件夹中有一个空白数据库,请删除该应用程序并重新安装以删除该空白数据库。

  3. 如果您在项目中包含了一个数据库(并假设您已将其添加到相关目标中),那么这意味着您的数据库中将找到该数据库。

    标准过程是编写一个例程来查看数据库是否存在于documents文件夹中,如果没有,则在尝试从documents文件夹中打开它之前,将其从bundle复制到documents文件夹。

    或者,或者,只是尝试在文档文件夹中打开它,如果由于找不到文件而失败,请将其从包中复制到文档文件夹,然后重试。例如:

    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
        }
    }