【问题标题】:How to relate NSManagedObjects Dynamically based on their dates?如何根据日期动态关联 NSManagedObjects?
【发布时间】:2014-03-15 13:44:28
【问题描述】:

您能否建议我如何自定义我的NSManagedObjects,以便Rep 实体可以在创建 Rep 实体和更改其日期属性时动态关联Day 实体?

我需要NSPredicate 的帮助来搜索与创建的Rep 实体具有相同DD/MM/YYYY 的Days,并且我需要知道在@987654329 时要覆盖哪些NSManagedObject 方法@实体被创建并且它的日期属性被改变。

我附上了一个设计流程图来澄清一下。

提前致谢。

【问题讨论】:

  • 为什么? day实体的目的是什么?您在代表上有约会,那么为什么需要这种关系?
  • @Wain 你的评论很有道理……我没想到……
  • 天将在未显示的其他实体之间进行协调。一次一个挑战。

标签: objective-c core-data nspredicate nsmanagedobject


【解决方案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 不匹配。

根据获取请求返回的结果,您将获取数组中的第一个对象(注意 B)并设置关系。相反,您将创建一个新的Day 对象并设置关系。

注意 A 这意味着您已经为 Rep 和 Day 创建了 NSManagedObject 的子类 注意 B 除了找到之外,您还有多少 Days?

右侧部分

对于第二部分,我将依赖 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。如果没有附加到任何Rep,这将允许您删除Days 对象。显然,这取决于您的需求。

希望对你有帮助。

【讨论】:

  • 我应该把代码放在哪里来观察托管对象上下文的变化?例如我想从 Day 中观察 rep.date ......但是 day 并不总是存在于 managedObjectContext 中,有时它只是作为故障存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 2017-09-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多