【问题标题】:Understanding object creation and comparison in CoreData了解 CoreData 中的对象创建和比较
【发布时间】:2012-01-09 09:57:12
【问题描述】:

我想知道如何对 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 方法并在其中实现一些逻辑时,比较才是“是”,例如:

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

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

谢谢

【问题讨论】:

    标签: objective-c core-data


    【解决方案1】:

    使用 objectID 标识托管对象:如果您的两个“对象”实际上代表同一个托管对象,则它们的 objectID 将相同。您可以通过以下方式确定:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-25
        • 1970-01-01
        相关资源
        最近更新 更多