Понимание создания и сравнения объектов в CoreData - PullRequest
0 голосов
/ 09 января 2012

Интересно, как выполняется сравнение объектов на сущностях CoreData.Предположим, у меня есть две сущности с отношением ко многим.

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

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

Предположим, я хочу получить сущность с определенной проп1 с помощью NSPredicate, для простоты, скажем, есть только одна EntityA, удовлетворяющая таким критериям:

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

Теперь я хочу получить все объекты EntityB, передающие entityA, в качестве критериев:

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 какое-то кэширование и повторное использование объектов.

спасибо

Ответы [ 2 ]

1 голос
/ 09 января 2012

Управляемые объекты идентифицируются с помощью идентификаторов объектов: если два ваших «объекта» фактически представляют один и тот же управляемый объект, их идентификаторы объектов будут одинаковыми. Вы можете определить это по:

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

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

0 голосов
/ 09 января 2012

В Objective-C == будет проверять, указывают ли entityB и A на один и тот же объект в памяти.Вы хотите использовать метод isEqual: для сравнения.Я думаю, что если бы вы использовали isEqual: метод, он вернул бы ДА, а если вы сделали ==, он, скорее всего, вернул бы НЕТ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...