您能否建议我如何自定义NSManagedObject
s,以便Rep
实体在创建Rep实体时以及何时可以动态地与Day
实体关联。日期属性是否已更改?
我需要NSPredicate
的帮助来搜索与创建的Day
实体具有相同DD / MM / YYYY的Rep
,我需要知道哪个NSManagedObject
创建Rep
实体以及更改日期属性时覆盖的方法。
我已附上设计流程图以澄清。
提前致谢。
答案 0 :(得分:1)
这里有一些建议可以实现你想要的。为清楚起见,我将我的答案分为两部分。第一部分是流程图的左侧部分。
左侧
创建Rep
时,您需要设置其日期(注意A )。为此,我将覆盖awakeFromInsert
方法。根据文件
您通常使用此方法初始化特殊的默认属性 值。此方法仅在对象的生命周期内调用一次。
插入新对象后,您应该针对具有特定谓词的Day
运行抓取请求,以搜索相同的日期。
在这里你不能简单地使用像
这样的谓词NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(eDate = %@)", selectedDate];
它不会起作用。而是使用Core Data Predicate Date Comparison中描述的解决方案。动机是数据15/03/2014 16:02:00与15/03/2014 16:02:01不匹配。
根据获取请求返回的结果,您将获取数组中的第一个对象( Note B )并设置关系。相反,您将创建一个新的Day
对象并建立关系。
注意A 这意味着您已为NSManagedObject
和日期创建了Rep
的子类
注意B 除了找到之外,你有多少Day
?
正确的部分
对于第二部分,我将依赖NSManagedObjectContextObjectsDidChangeNotification
。此通知对于侦听发生的更改非常有用。
发生更改时,notification
将包含已删除,已插入或已更新对象的NSSet
。
NSSet *updatedObjects = [[notification userInfo] valueForKey:NSUpdatedObjectsKey];
NSSet *deletedObjects = [[notification userInfo] valueForKey:NSDeletedObjectsKey];
NSSet *insertedObjects = [[notification userInfo] valueForKey:NSInsertedObjectsKey];
// Place your logic here...
很明显,你需要用那里的逻辑替换评论。它看起来像以前的那样。但重要的是过滤通知中返回的对象。您只对Rep
的更改感兴趣。所以,例如
NSSet *objects = nil;
NSMutableSet *combinedSet = nil;
NSPredicate *predicate = nil;
NSDictionary *userInfo = [notification userInfo];
objects = [userInfo valueForKey:NSInsertedObjectsKey];
combinedSet = [NSMutableSet setWithSet:objects];
objects = [[notification userInfo] valueForKey:NSUpdatedObjectsKey];
[combinedSet unionSet:objects];
objects = [[notification userInfo] valueForKey:NSDeletedObjectsKey];
[combinedSet unionSet:objects];
predicate = [NSPredicate predicateWithFormat:@"entity.name == %@,
@"Rep"];
[combinedSet filterUsingPredicate:predicate];
if ([combinedSet count] == 0) {
return;
}
// Place your logic here…
最后,为了维护一致性图,我将使用从Rep
到Day
的级联关系,并使Day
到Rep
无效。如果没有附加到任何Day
,这将允许您删除Rep
个对象。显然这取决于你的需求。
希望它有所帮助。