sqlite:如何在ios中启用外键(PRAGMA foreign_keys总是返回0)

时间:2016-02-07 12:00:18

标签: ios swift sqlite

IOS,SQLite实施问题

尽管在建立连接后尝试立即打开外键,即使该查询的结果没有产生错误,我的后续检查也显示外键未启用。

我无法弄清楚原因。这是代码:

    var sqliteDB: COpaquePointer = nil
    let dbPath = (documentsPath as NSString).stringByAppendingPathComponent("test.sqlite3")

    let status = sqlite3_open(dbPath.cStringUsingEncoding(NSUTF8StringEncoding)!, &sqliteDB)
    if status != SQLITE_OK {
        print("Error Opening Database")
        if let errMsg = String.fromCString(sqlite3_errmsg(sqliteDB)) {
            print("\(errMsg)")
        }
    }

    if sqlite3_exec(sqliteDB, "PRAGMA foreign_keys = ON", nil, nil, nil) != SQLITE_OK {
        let err = String.fromCString(sqlite3_errmsg(sqliteDB))
        print("error attempting to enable foreign keys: \(err)")
    }

    let test = sqlite3_exec(sqliteDB, "PRAGMA foreign_keys", nil, nil, nil)

    print("Result of check: \(test)")   // Result of check: 0

在上面的代码中,'test'始终为零,表示未启用外键。我也尝试过使用sqlite3_prepare_v2。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

当您测试“PRAGMA foreign_keys”时,您需要加载一个实际行,该行包含您要查找的布尔值。 sqlite3_exec不是加载行的正确方法:它专门用于轻松执行一堆SQL语句,而不是加载行。

以下是检查方法:

<ul>
<li>
type

<select>
<option>type1</option>
<option>type2</option>
</select>

</li>
</ul>

<p></p> 

顺便说一句,您也可以使用现成的SQLite包装器,例如https://github.com/groue/GRDB.swift