Kev*_*ian 3 database sqlite swift grdb
我正在尝试写入我创建的报价数据库。如果用户选择“收藏夹”按钮,它将在SQLITE数据库的“收藏夹”列中添加1(或true)值。由于某些原因,我无法写入数据库,也无法执行以下代码:
@IBAction func addFavorite(_ sender: Any) {
var configuration = Configuration()
configuration.readonly = false
let dbPath = Bundle.main.path(forResource: "data", ofType: "db")!
let dbQueue = try! DatabaseQueue(path: dbPath, configuration: configuration)
try! dbQueue.inDatabase { db in
try db.execute("""
UPDATE quotes SET favorite = 1 WHERE quote = ?;
""",
arguments: [quoteLabel.text])
}
Run Code Online (Sandbox Code Playgroud)
我希望将结果写入数据库,并将1放入“喜欢的”列中,但不幸的是事实并非如此。我收到此错误:
线程1:致命错误:“尝试!” 表达式意外引发错误:带有语句
UPDATE quotes SET favorite = 1 WHERE quote = ?参数的SQLite错误8 [“节制是原因的更强更清晰的解释。”]:尝试编写只读数据库
我已经尝试chmod 755了数据库,但是也没有用。我想念什么吗?
数据库的路径是应用程序资源的路径。无法在iOS中修改应用程序资源。
有关更多信息,请参见文件系统基础。特别相关的报价:
[...]应用程序的捆绑包。此目录包含应用程序及其所有资源。
您无法写入此目录。为防止篡改,捆绑目录在安装时签名。写入此目录会更改签名,并阻止您的应用启动。但是,您可以对应用程序捆绑包中存储的所有资源进行只读访问。有关更多信息,请参见《资源编程指南》。
现在,如果无法修改,该如何在数据库中编写呢?
好吧,将其复制到可以修改它的地方。您将永远不会修改捆绑的数据库资源,而只会修改副本。
再次有可用的文档:如何打开存储为应用程序资源的数据库?GRDB常见问题解答说:
如果应用程序应修改数据库资源,则需要将其复制到可以对其进行修改的位置。例如,在“应用程序支持”目录中。只有这样,才能打开连接:
Run Code Online (Sandbox Code Playgroud)let fileManager = FileManager.default let dbPath = try fileManager .url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true) .appendingPathComponent("db.sqlite") .path if !fileManager.fileExists(atPath: dbPath) { let dbResourcePath = Bundle.main.path(forResource: "db", ofType: "sqlite")! try fileManager.copyItem(atPath: dbResourcePath, toPath: dbPath) } let dbQueue = try DatabaseQueue(path: dbPath)
| 归档时间: |
|
| 查看次数: |
551 次 |
| 最近记录: |