swift CoreData轻量级迁移问题

50pmv0ei  于 2022-12-22  发布在  Swift
关注(0)|答案(3)|浏览(207)

我已经在Swift 5中编写了这个应用程序,并且已经在App Store中上线。
现在,我只想添加一个新的单个布尔属性coredata中的一个现有实体
为此,我采取了以下步骤:
1.在Project. xcdatamodeld中添加了版本(在其中自动创建了Project 2.xcdatamodel文件)
1.将此版本设置为默认版本
1.向此新版本文件中的实体添加一个属性。
1.已将属性应该自动迁移存储应该自动Infermapping模型添加到应用委托类中的NSPersistentContainer。

    • 发行日期:**

在应用程序中,我能够成功地将数据保存在coredata中,并从任何ViewController中的coredata中检索数据,但如果应用程序从启动时打开,则无法找到之前的文件并重新创建coredata文件。
每当我打开应用程序时,它都会在xCode控制台中显示错误:

Connecting to sqlite database file at "/dev/null"
    • 应用委托代码:**
// MARK: - Core Data stack

lazy var persistentContainer: NSPersistentContainer = {

let container = NSPersistentContainer(name: "Project")

let description = NSPersistentStoreDescription()
description.shouldMigrateStoreAutomatically = true
description.shouldInferMappingModelAutomatically = true
container.persistentStoreDescriptions=[description]

container.loadPersistentStores(completionHandler: { (storeDescription, error) in
    if let error = error as NSError? {
        
        fatalError("Unresolved error \(error), \(error.userInfo)")
    }
})
return container }()
sqserrrh

sqserrrh1#

您需要指定实际模型数据库位置的URL。

guard let storeURL = try? FileManager
   .default
   .url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
   .appendingPathComponent("yourModel.sqlite") else {
      fatalError("Error finding Model from File Manager")
    }
    
    let container = NSPersistentContainer(name: yourModelName, managedObjectModel: yourModelInstance)
    
    let description = NSPersistentStoreDescription(url: storeURL)
    description.type = NSSQLiteStoreType
    description.shouldMigrateStoreAutomatically = true
    description.shouldInferMappingModelAutomatically = true
    container.persistentStoreDescriptions = [description]
    
    container.loadPersistentStores(completionHandler: { storeDescription, error in
l5tcr1uw

l5tcr1uw2#

错误消息可能表示应用不知道在何处查找或保存数据库文件。短语"/dev/null"表示在内存存储中。
尝试使用

let description = NSPersistentStoreDescription(url: <- File url to the main database file ->)

而不是当前示例化。

kmbjn2e3

kmbjn2e33#

container.persistentStoreDescriptions = description更改为container.persistentStoreDescriptions.append(description)后,此问题已得到修复。完整代码:

public lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: dataModelName)
    var description = NSPersistentStoreDescription()
    description.shouldMigrateStoreAutomatically = true
    description.shouldInferMappingModelAutomatically = true
    container.persistentStoreDescriptions.append(description)
    container.viewContext.mergePolicy = NSMergePolicy.overwrite
    container.loadPersistentStores { _, error in
        if let error = error {
        }
    }
    return container
}()

相关问题