核心数据在第一次启动时将数据保存到错误的数据库中



我有一个带有两种配置的数据模型。一个用于预加载数据,另一个用于用户数据。首先,将PRELOAD SQLLITE数据库复制到文档文件夹。用户数据数据库是由applicationsUpport目录中的核心数据创建的。到目前为止,一切正常。但是现在问题是:如果这是第一个开始,即使调用了SaveContext((方法,也无法保存。在下一个应用程序启动时,所有用户数据都消失了。但这不是第一个启动,一切正常,并且在下一个应用程序开始时所有用户数据都存在。有人知道问题是什么吗?在这里,我的核心数据堆栈:

    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "CoreData_App")
        container.persistentStoreDescriptions[0].configuration = "PreloadData"
        container.persistentStoreDescriptions[0].url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("PreloadData.sqlite")
        let userStoreDescription = NSPersistentStoreDescription(url: FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!.appendingPathComponent("UserData.sqlite"))
        userStoreDescription.configuration = "UserData"
        container.persistentStoreDescriptions.append(userStoreDescription)

        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error (error), (error.userInfo)")
            }
        })
        return container
    }()
    // MARK: - Core Data Saving support
    func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                let nserror = error as NSError
                fatalError("Unresolved error (nserror), (nserror.userInfo)")
            }
        }
    }

编辑经过大量的测试,我发现数据在第一次启动时将数据存储在预紧数据库中,并且在用户数据数据库中正确的第二次启动中存储了数据。但是我想在用户数据库中的第一个启动时也保存数据。在这里,我保存数据的代码:

@IBAction func pressedFavoriteButton(_ sender: UIButton) {
        if userRating == nil {
            let rating = UserRating(context: DataController.sharedInstance.persistentContainer.viewContext)
            rating.entryID = (entry?.id)!
            userRating = rating
        }
        apiHandler.sendRequest(.POST) { (response, error) in
            if let error = error {
                print(error.localizedDescription)
                return
            }
            DispatchQueue.main.async {
                self.userRating?.isFavorite = !self.favoriteButton.isSelected
                self.favoriteButton.isSelected = !self.favoriteButton.isSelected
               DataController.sharedInstance.saveContext()
            }
        }
    }

首先让我们正确设置商店,

let preloadDataStoreDescription = NSPersistentStoreDescription(url: FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("PreloadData.sqlite"))
let userStoreDescription = NSPersistentStoreDescription(url: FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!.appendingPathComponent("UserData.sqlite"))
    userStoreDescription.configuration = "UserData"
preloadDataStoreDescription.configuration = "PreloadData"
container.persistentStoreDescriptions = [preloadDataStoreDescription, userStoreDescription]

由于您有2个数据库,因此取决于您存储的实体。

如果该实体属于预紧装配置,则将存储在预紧数据库中,否则将存储在用户数据库中。

P.S。您也可以使用标志进一步调试

-com.apple.CoreData.SQLDebug 1

在编辑方案>参数>在启动

上传递的参数

另外,如果不是真正需要的话,我建议不要将设计复杂化。

相关内容

  • 没有找到相关文章

最新更新