我正在尝试使用新的Entity Constraints检查器在核心数据中设置约束(使项目的名称唯一)。我读过的所有内容都说它非常简单 - 设置约束并处理错误。我没有收到任何错误,可以根据需要添加相同的条目。
该应用确实需要IOS 9.0,Xcode工具要求设置为7.0
约束category1Name是一个String。
我的addItem代码是:
FileSystemStorage
AppDelegate保存是标准的:
Storage
这是核心数据约束:
此应用已启用iCloud。
managedObjectContext合并策略设置为NSMergeByPropertyObjectTrumpMergePolicy
func addNewRecord() {
//check to be sure the entry is not empty
if (categoryTextField.text == "") {
//prompt requiring a name
let ac = UIAlertController(title: nil, message: "Name Required", preferredStyle: .Alert)
ac.addAction(UIAlertAction(title: "Ok", style: .Default, handler: nil))
self.presentViewController(ac, animated: true, completion: nil)
} else {
let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName("Category1", inManagedObjectContext: kAppDelegate.managedObjectContext) as! Category1
newManagedObject.category1Name = categoryTextField.text
newManagedObject.category1Description = categoryTextView.text
//bunch more items...
//save it
kAppDelegate.saveContext()
makeEntryFieldsEnabledNO()
performSegueWithIdentifier("unwindToCategoriesTableViewController", sender: self)
}//if else
}//addNewRecord
任何指导都将不胜感激。
答案 0 :(得分:3)
Apple似乎终于解决了疯狂的Xcode问题,即您在数据模型文件中所做的更改实际上并没有改变,这不是玩笑。
放在一边,当前公式似乎是:
在您的核心数据单例中...
container = NSPersistentContainer(name: _nom)
// during development, right HERE likely delete the sql database file
// and start fresh, as described here stackoverflow.com/a/60040554/294884
container.loadPersistentStores { storeDescription, error in
if let error = error {
print("\n ERROR LOADING STORES! \(error) \n")
}
else {
print("\n STORES LOADED! \(storeDescription) \n")
}
self.container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
self.container.viewContext.automaticallyMergesChangesFromParent = true
}
然后在您的数据模型文件中
然后,当您添加新数据时,您必须
perform
容易吗?
类似
let pm = core.container.newBackgroundContext()
pm.perform {
for onePerson in someNewData {
... create your new CDPerson entity ...
}
pm.bake()
}
请注意,烘焙例程位于Perform块内,
它看起来像这样:
func bake() {
self.performAndWait {
if self.hasChanges {
do {
try self.save()
}
catch {
print("bake disaster type 1 \(error)")
}
}
// OPTIONALLY, SEE BELOW
if core.container.viewContext.hasChanges {
do {
try core.container.viewContext.save()
}
catch {
print("bake disaster type 2 \(error)")
}
}
// OPTIONALLY, SEE BELOW
}
}
为清楚起见,请注意函数pm.bake
中的bake()
...,上半部的self
实际上是为循环创建的newBackgroundContext
在表演里面。
现在,automaticallyMergesChangesFromParent
似乎工作得很好,如果您“执行上面长长的列表中的所有操作”。
•在上面的烘烤中,添加一些打印行以查看保存到viewContext的内容。您会看到什么都没有保存。引擎中的子级/子级关系都可以正确完成
•因此,实际上,您实际上可以忽略代码的该部分。您所要做的就是
func bake() {
self.performAndWait {
if self.hasChanges {
do {
try self.save()
}
catch {
print("bake disaster type 1 \(error)")
}
}
}
答案 1 :(得分:2)
上面pbasdf的评论似乎是正确的。检查员的约束不保存。我使用了提供的链接中建议的两种方法 - 我添加了约束,我更改了另一个属性,执行了文件保存,然后更改了该属性并再次保存文件。约束现在按照我的预期行事。我会将此标记为已回答。 pbasdf应该得到信用。
答案 2 :(得分:0)
如果您想在出现合并冲突时遇到错误并手动处理它们,那么您需要将策略更改为NSErrorMergePolicy,您将收到错误,并在用户信息中找到解决合并冲突所需的对象ID,否则它将根据指定的合并策略进行合并和保存。 如果要覆盖属性和关系,则设置的策略将覆盖对象属性而不覆盖关系,然后指定NSMergeByPropertyObjectTrumpMergePolicy。