无法获取数据库路径

时间:2018-04-19 05:43:48

标签: swift sqlite filepath local-database

集成的SQLITE数据库,下面是我编写的代码,

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
        self.copyDatabaseIfNeeded()
        return true
}

func copyDatabaseIfNeeded() {
    let fileManager = FileManager.default
    let dbPath = getDBPath()
    var success: Bool = fileManager.fileExists(atPath: dbPath!)
    if !success {
        let defaultDBPath = URL(fileURLWithPath: Bundle.main.resourcePath ?? "").appendingPathComponent(APPLICATION_DB).absoluteString
        success = ((try?fileManager.copyItem(atPath: defaultDBPath, toPath: dbPath!)) != nil)
        if !success {
            print("Failed to create writable database!")
        }
    }
}

func getDBPath() -> String? {
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    let documentsDir = paths[0]
        return URL(fileURLWithPath: documentsDir).appendingPathComponent(APPLICATION_DB).absoluteString
}

它总是打印在输出下面,

enter image description here

  • 尝试清理+构建项目
  • 卸载应用程序,重新安装
  • 删除派生数据

以上都没有奏效。

另外,我的sqlite文件在项目目标中 - >构建阶段 - >复制捆绑资源:下面的屏幕截图供参考。

enter image description here

我不确定我的文件的层次结构是否重要,并附上该文件的截图。

enter image description here

任何人都可以帮助我,为什么我在获取数据库文件的文件路径时遇到问题?

1 个答案:

答案 0 :(得分:1)

试试这个。

func copyDatabaseIfNeeded() {
    // Move database file from bundle to documents folder

    let fileManager = FileManager.default

    let documentsUrl = fileManager.urls(for: .documentDirectory,
                                                in: .userDomainMask)

    guard documentsUrl.count != 0 else {
        return // Could not find documents URL
    }

    let finalDatabaseURL = documentsUrl.first!.appendingPathComponent("SQL.sqlite")

    if !( (try? finalDatabaseURL.checkResourceIsReachable()) ?? false) {
        print("DB does not exist in documents folder")

        let documentsURL = Bundle.main.resourceURL?.appendingPathComponent("SQL.sqlite")

        do {
              try fileManager.copyItem(atPath: (documentsURL?.path)!, toPath: finalDatabaseURL.path)
              } catch let error as NSError {
                print("Couldn't copy file to final location! Error:\(error.description)")
        }

    } else {
        print("Database file found at path: \(finalDatabaseURL.path)")
    }

}