我有一个带有两种配置的数据模型。一个用于预加载数据,另一个用于用户数据。首先,将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
在编辑方案>参数>在启动
上传递的参数另外,如果不是真正需要的话,我建议不要将设计复杂化。