ios - 使用 SQLITE 的 Swift 应用程序在更新数据库后崩溃。 SQLITE 文件未复制到文件/包

标签 ios swift sqlite

在我使用新的 SQLite 浏览器对我的 sqlite 文件进行一些更改之前,我的应用程序运行良好。然后打开数据库突然出现问题。 数据库打开函数如下所示:

func openDatabase() -> Bool {
        do {
            let manager = FileManager.default

            let documentsURL = try manager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("database.sqlite")
            var rc = sqlite3_open_v2(documentsURL.path, &db, SQLITE_OPEN_READWRITE, nil)
            if rc == SQLITE_CANTOPEN {
                let bundleURL = Bundle.main.url(forResource: "database", withExtension: "sqlite")!
                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
        }     
    }

在使用 SQLite 数据库浏览器 更改数据库后,应用程序在打开数据库时崩溃,并指出此行在展开可选值时给出了意外的 nil:

 let bundleURL = Bundle.main.url(forResource: "database", withExtension: "sqlite")!

日志给出以下文本:

2018-12-20 18:16:22.306631+0100 eFloraSnap[7844:165367] [logging-persist] cannot open file at line 42249 of [95fbac39ba]
2018-12-20 18:16:22.306810+0100 eFloraSnap[7844:165367] [logging-persist] os_unix.c:42249: (0) open(/Users/tomsol/Library/Developer/CoreSimulator/Devices/143DCE6E-01F0-40D0-9640-6397504D81FA/data/Containers/Data/Application/6BB619CB-BEF9-4917-9A74-8C92D84DA2F0/Documents/database.sqlite) - Undefined error: 0
(lldb) 

我不明白。我用“Clean My Mac”完全卸载了 Xcode,然后从头开始重新安装了 Xcode,希望删除一些错误的设置。这没有解决任何问题。认为某些数据库格式可能存在问题。

还有其他原因吗?

编辑: 我现在看到,databse.sqlite 不在日志中给出的路径中。那么为什么在构建和运行时没有将sqlite文件复制到那里呢?设备与模拟器存在同样的问题。

最佳答案

好吧,似乎完全卸载 Xcode 并不能修复错误的设置。 在 Buildphases-Copy 包资源中添加 sqlite 文件修复了它。为什么它第一次从复制包资源中消失是未知的。为什么它没有使用新安装的 xcode 自动添加也是未知的。

关于ios - 使用 SQLITE 的 Swift 应用程序在更新数据库后崩溃。 SQLITE 文件未复制到文件/包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53873463/

相关文章:

swift - 用异步方法关闭(Swift 2.0)

ios - 声明一个多类型数组

sqlite - 如何快速了解 SQLite 中的表结构?

android - SQLiteDatabase.query 是否使用 PreparedStatements ?

ios - UITableView 方法和等效的 UITableViewDatasource 方法有什么区别?

iOS 应用程序即使在安装后也会崩溃,但新用户不会

objective-c - 如何使用 Scrollview(或最佳实践)垂直和水平地进行 Card Deck 样式页面转换

ios - React Native(iOS) Module AppRegistry 不是注册的可调用模块(调用runApplication)

swift - 即使我在 swift 中使用了正确的标签,也无法访问我想要的按钮标题

objective-c - 如何在此代码中修复间接指针的转换(在ARC下)?