如何根据日期动态关联NSManagedObjects?

时间:2014-03-15 13:44:29

标签: objective-c core-data nspredicate nsmanagedobject

您能否建议我如何自定义NSManagedObject s,以便Rep实体在创建Rep实体时以及何时可以动态地与Day实体关联。日期属性是否已更改?

我需要NSPredicate的帮助来搜索与创建的Day实体具有相同DD / MM / YYYY的Rep,我需要知道哪个NSManagedObject创建Rep实体以及更改日期属性时覆盖的方法。

我已附上设计流程图以澄清。

提前致谢。

enter image description here

1 个答案:

答案 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…

最后,为了维护一致性图,我将使用从RepDay的级联关系,并使DayRep无效。如果没有附加到任何Day,这将允许您删除Rep个对象。显然这取决于你的需求。

希望它有所帮助。