了解CoreData中的对象创建和比较

时间:2012-01-09 09:57:12

标签: objective-c core-data

我想知道如何对CoreData实体进行对象比较。 假设我有两个实体,具有多对多的关系。

EntityA {
 prop1
 entityB <-- to-many relationship
}

EntityB {
 .... properties
 entityA <-- one-to-one relationship
}

假设我想要使用NSPredicate检索具有某个prop1的实体,为简单起见,假设只有一个EntityA满足此类条件:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"prop1=%@",x];
EntityA *entityA = //execute fetch

现在我想检索所有通过entityA的EntityB作为标准:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"EntityA=%@",entityA];
EntityB *entityB = //execute fetch
EntityA *parentA = entityB.entityA;

此时考虑到我没有覆盖任何方法,但EntityA和EntityB只是扩展NSManagedObject,这个语句的结果是什么?

if(entityA==parentA) NSLog(@"YES");
else NSLog("NO");

如果是“是”,为何会有这样的结果?我在同一个执行中有多少个对象?例如,使用Java中我知道的任何持久层将导致两个不同的对象,只有当我覆盖相关类的equals方法并在其中实现某些逻辑时,比较才是“YES”,例如:

if(objA.getRegistrationNumber()==objA.getRegistrationNumber()) return true;

在这种情况下,我想知道CoreData是否正在进行某种对象缓存和重用。

感谢

2 个答案:

答案 0 :(得分:1)

使用objectID识别托管对象:如果你的两个&#34;对象&#34;实际上代表相同的托管对象,它们的objectID将是相同的。您可以通过以下方式确定:

[[objectA objectID] isEqual:[objectB objectID]]

请参阅http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectID_Class/Reference/NSManagedObjectID.html

答案 1 :(得分:0)

在Objective-C中==将检查entityB和A是否指向内存中的同一对象。您可能希望使用isEqual:方法进行比较。 我认为,如果您使用isEqual:方法,则会返回YES,如果您执行了==,则很可能会返回NO。