sqlite3_open适用于swift playground而不是swift app

时间:2017-11-25 00:54:24

标签: swift xcode macos sqlite

当我在swift playground中运行以下代码时,它返回成功。当我将它复制到我的Xcode项目时,它返回失败。我认为它与路径有关,所以我用Google搜索并尝试了path.cString(使用:String.Encoding.utf8),但仍然没有运气。我不明白的是它为什么在游乐场工作,而不是在应用程序本身。

var db: OpaquePointer? = nil;
let path:String="/Users/williamstorey/Documents/db182.db"
if sqlite3_open(path ,&db) == SQLITE_OK {
   print("SUCCESS")
} else {
   print("FAILURE");
}

1 个答案:

答案 0 :(得分:2)

您不应只检查它是否为SQLITE_OK,而是保存返回代码并检查返回的值,如果它不是SQLITE_OK。如果你不查看实际的返回代码值,你只是猜测问题可能是什么。

但最可能的问题是你的应用程序是沙箱,不能只在那里打开文件。您应该动态构建URL,然后您将获得一个安全的文件URL /路径:

let fileURL = try! FileManager.default
    .url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
    .appendingPathComponent("db182.db")

print(fileURL.path)

let returnCode = sqlite3_open(fileURL.path, &db)

这将导致类似:

/Users/williamstorey/Library/Containers/com.domain.MyApp/Data/Documents/db182.db

坦率地说,您可能希望使用.applicationSupportDirectory而不是.documentDirectory。见File System Programming Guide: The Library Directory Stores App-Specific Files。另请参阅About App Sandbox