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

Failure to load iOS core data database first time

提问人:David.Chu.ca 提问时间:5/8/2022 最后编辑:David.Chu.ca 更新时间:5/8/2022 访问量:117

问:

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

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

我的应用程序对现有用户运行正常,因为他们有 db 文件。但是,对于新用户,我的应用程序崩溃了。新用户在首次运行时没有数据库。我在 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) 中发生了哪些变化。加载持久性存储时缺少什么?

iOS Swift iPhone 核心数据

评论

0赞 David.Chu.ca 5/8/2022
实际上,我问题中的代码是正确的。在我的实际项目中,更复杂的代码,我犯了错误,没有将数据库名称添加到 URL。如果您仔细查看我的错误消息,数据库名称不在 URL 中:“MyDatabaseFile”不在末尾。无论如何,简化的代码工作正常,
1赞 vadian 5/8/2022
为什么要重新发明轮子?默认情况下,Core Data 会代表您完成创建数据库文件的所有工作。
0赞 Ptit Xav 5/9/2022
您是否尝试先创建应用程序支持目录,因为它默认不存在。
0赞 David.Chu.ca 5/9/2022
@PtitXav“应用程序支持”始终存在,正如您在代码中看到的那样。我喜欢的是专门为我的应用程序的数据库文件创建一个子文件夹,这样它就不会与 Apple 或我的应用程序的其他文件混淆(我将来可能会添加更多文件)。我将我的数据库名称保存在某个地方并检索该名称以供将来启动,但首次使用的用户根本无法获得数据库文件名。这就是为什么只有首次用户体验崩溃问题的原因。现在我解决了这个问题。如果应用程序找不到,首次使用将使用默认名称,并在创建后保存该名称。

答: 暂无答案