也许有人可以告诉我我是否走对了。
我有两个实体:
使用以下属性进行 练习:标题 - 字符串;练习 ID - 整数
添加了具有以下属性的 Exercise : count - int;added_exercise_id - int
AdditionalExercise 有一个名为link_exercise的提取属性,其目标为:Exercise 和谓词:exercise_id == $FETCH_SOURCE.added_exercise_id
在我的代码中,我执行以下操作:
for(AddedExercise *e in listOfAddedEx){
[moc refreshObject:e mergeChanges:YES];
NSLog(@"%@", e.link_exercise);
}
日志说:
() 的关系错误,名称 link_exercise,isOptional 1,isTransient 1,实体 AdditionalExercise,renamingIdentifier link_exercise,验证谓词 (),警告 (),versionHashModifier (null) userInfo {},fetchRequest(实体:练习;谓词:(exercise_id == $FETCH_SOURCE.added_exercise_id); sortDescriptors: ((null)); type: NSManagedObjectResultType; ) 在 0x1700d8b80
所以似乎有什么东西存在,以故障为代表。但如果我尝试访问“link_exercise”数组。例如: e.link_exercise.count或e.link_exercise.lastObject
我会收到以下错误:
'NSUnknownKeyException',原因:'[<_NSCoreDataTaggedObjectID 0xd000000000040002> valueForUndefinedKey:]:此类与键 added_exercise_id 的键值编码不兼容。
也许有人知道如何解决这个问题。
提前谢谢了。
SR
----->更新1:
我现在将谓词更改为: SELF.exercise_id=exercise_id
现在我可以访问练习对象,但我得到了错误的 ID,因为
SELF.exercise_id=exercise_id应该看起来像SELF.exercise_id= added_exercise_id
使用谓词SELF.exercise_id= added_exercise_id我得到以下错误:
'NSInvalidArgumentException',原因:'无法为谓词(exercise_id == added_exercise_id)生成 SQL(RHS 上的问题)'
----->更新2:
仍然无法弄清楚为什么它不起作用......
对我来说似乎
SELF.exercise_id == $FETCH_SOURCE.added_exercise_id
应该是正确的谓词,但它不起作用。也许其他人有一些建议......?
或者我应该自己创建一个获取请求(以编程方式)?这意味着为所有“Exercise”设置一个获取请求,并在exercise_id = added_exercise_id 处返回一个。这基本上就是我目前试图通过获取的属性来解决的问题。
-----> 更新 3: 好的,我几乎拥有它!我忘了提到的一件事是,我使用了一个多 managedObjectContext 核心数据堆栈(包括一个 worker-,main-master-context)
masterContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
masterContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
[masterContext setPersistentStoreCoordinator: coordinator];
mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
mainContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
mainContext.parentContext = masterContext;
workerContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
workerContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
workerContext.parentContext = mainContext;
我所有的请求都转到工作上下文(在这种情况下,获取的正确内容不起作用)但是如果我的所有请求都转到主上下文,则获取的属性按预期工作!
所以它似乎只适用于具有持久存储的 managedObjectContext 。
有人可以解释一下,为什么这不能与其他 managedObjectContext 一起使用?