gpt4 book ai didi

ios - Core Data 首次启动时将数据保存到错误的数据库中

转载 作者:行者123 更新时间:2023-11-30 12:29:19 26 4
gpt4 key购买 nike

我有一个具有两种配置的 DataModel。一个用于预加载数据,另一个用于用户数据。首次启动时,预加载 SQLLite 数据库将复制到文档文件夹。用户数据数据库是由ApplicationSupport目录中的Core Data创建的。到目前为止一切正常。但现在的问题是:如果是第一次启动,即使调用了 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 个数据库,因此这取决于您要存储的实体。

如果实体属于预加载配置,它将存储在预加载数据库中,否则它将存储在用户数据库中。

附注您还可以使用该标志进一步调试

-com.apple.CoreData.SQLDebug 1

在编辑方案 > 参数 > 启动时传递的参数

此外,如果不是真的需要,我建议不要使用 2 个数据库来使设计复杂化。

关于ios - Core Data 首次启动时将数据保存到错误的数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43786641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com