gpt4 book ai didi

ios - 使用 SQLite (Swift) 将数据库更改保存到 .db 文件中

转载 作者:行者123 更新时间:2023-11-28 05:41:49 25 4
gpt4 key购买 nike

在我的项目中,我从 .db 打开一个已经存在的数据库与 sqlite3_open .此文件是使用命令行工具创建的 sqlite3 .我正在更新表中的一些行,这工作正常,但这些更新仅在数据库的临时实例中进行。我怎样才能同时更新我的​​ .db为我的项目的 future 运行创建文件以使用更新的数据?

有人问here如何在 Swift 中保存 SQLite 数据库。但答案在我看来似乎并不令人满意,因为文件的格式应该与 sqlite3 创建的格式相同。 , 以便可以通过 sqlite3_open 再次打开它.

SQLite 甚至可能提供一个函数吗?我找不到任何东西...

最佳答案

您不能修改 bundle 的内容。因此,您需要将文件复制到某个可以修改的目录中。从历史上看,我们可能建议为此使用“文档”文件夹。但是现在我们使用“应用程序支持目录”。参见 iOS Storage Best Practices .

总之,基本思路是:

  • 将原始数据库包含在 bundle 中(如果您还没有将其添加到应用的目标中);

    enter image description here

  • 尝试打开数据库(使用 SQLITE_READWRITE 选项而不是 SQLITE_CREATE 选项...如果没有,我们不希望它创建一个空白数据库'在应用程序支持目录中找到它);和

  • 如果失败(因为找不到文件),将数据库从包复制到应用程序支持目录并重试

因此,也许是这样的:

var db: OpaquePointer?

enum DatabaseError: Error {
case bundleDatabaseNotFound
case sqliteError(Int32, String?)
}

func openDatabase() throws {
let fileURL = try FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
.appendingPathComponent("database.db")

// try opening database and just return if it succeeded

if sqlite3_open_v2(fileURL.path, &db, SQLITE_OPEN_READWRITE, nil) == SQLITE_OK {
return
}

// if it failed, clean up before trying again ...

sqlite3_close(db)
db = nil

// then copy database from bundle ...

guard let bundlePath = Bundle.main.url(forResource: "database", withExtension: "db") else {
throw DatabaseError.bundleDatabaseNotFound
}
try FileManager.default.copyItem(at: bundlePath, to: fileURL)

// and try again

let rc = sqlite3_open_v2(fileURL.path, &db, SQLITE_OPEN_READWRITE, nil)

if rc == SQLITE_OK { return }

// and if it still failed, again, clean up, and then throw error

let errorMessage = sqlite3_errmsg(db)
.flatMap { String(cString: $0) }

sqlite3_close(db)
db = nil

throw DatabaseError.sqliteError(rc, errorMessage)
}

关于ios - 使用 SQLite (Swift) 将数据库更改保存到 .db 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56416832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com