代码之家  ›  专栏  ›  技术社区  ›  David.Chu.ca

首次加载iOS核心数据数据库失败

  •  0
  • David.Chu.ca  · 技术社区  · 4 年前

    在我的iOS应用程序中,我的数据库位于 Application support/myDatabase 文件夹Hare是用于创建此文件夹(如果不存在)的代码:

    class MyDatabaseURLHelper {
      private databaseBase: URL {
        let baseDir: FileManager.SearchPathDirectory = 
          .applicationSupportDirectory
        let subDir = "myDatabase"
        var url = FileManager.default.urls(
          for: baseDir,
          in: .userDomainMask).first!.appendPathComponent(subDir)
        return url
      }
    
      func databaseURL() -> URL? {
        var url: URL? = databaseBase
        let dbName = "MyDatabaseFile"
        if !FileManager.default.fileExists(atPath: url.path) { 
          do {
            try FileManager.default.createDirectory(
              atPath: databaseBase.path, 
              withIntermediateDirectories: true, 
              attributes: nil)
          } catch {
            url = nil
        }
        return url?.appendPathComponent(dbName)
      }
    }
    

    我已经测试了以上代码。如果数据库子文件夹不存在(第一次),则会创建该数据库子文件夹,并且数据库url看起来很好。

    以下是我加载数据库的代码片段:

    let modelName = "MyDatabase"
    let container = NSPersistentContainer(name: modelName)
    let url = MyDatabaseURLHelper().databaseURL()!
    let storeDesription = NSPersistentStoreDescription(url: url)
    storeDesription.shouldInferMappingModelAutomatically = true
    storeDesription.shouldMigrateStoreAutomatically = true
    container.persistentStoreDescriptions = [storeDesription]
    container.loadPersistentStores() {
      (storeDescription, error) in
        if let error = error as NSError? {
          let msg = "Unresolved error \(error), \(error.userInfo)"
          fatalError(msg) // <- I got exception here! if database file does not exist first time.
        }
    }
    return container // No errors if database exists
    

    我的应用程序对现有用户运行正常,因为他们有数据库文件。然而,对于新用户来说,我的应用程序崩溃了。新用户在第一次运行时没有数据库。我在Xcode模拟器中验证了相同的结果。

    以下是错误消息:

    *"Unresolved error Error Domain=NSCocoaErrorDomain Code=256 \"The file “MyDatabase” couldn’t be opened.\" UserInfo={NSFilePath=/Users/.../Application/8DBC6D4F-967C-433D-9B28-60451CDAECDB/Library/Application Support/myDatabase, \"NSSQLiteErrorDomain\": 14]"*   
    

    不确定最近的iOS(15.4)中发生了什么变化。加载持久性存储缺少什么?

    0 回复  |  直到 4 年前