代码之家  ›  专栏  ›  技术社区  ›  Tom Tallak Solbu

更新数据库后,带有SQLITE的Swift应用程序崩溃。SQLITE文件未复制到file/bundle

  •  1
  • Tom Tallak Solbu  · 技术社区  · 6 年前

    我的应用程序运行得很好,直到我使用了一个新的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) 
    

    我不明白。我完全卸载了Xcode和“清理我的Mac”安重新安装Xcode从头开始,希望删除som坏设置。这没有解决任何问题。认为某些数据库格式可能有问题。

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Tom Tallak Solbu    6 年前

    看来完全卸载Xcode并不能修复坏的设置。 在Buildphases中添加sqlite文件Copy bundle resources修复了它。为什么它在第一次从拷贝包资源中消失还不得而知。为什么没有使用新安装的xcode自动添加它也不得而知。