Restkit + Coredata — добавление только уникальных объектов в отношение «один ко многим».

У меня есть веб-служба сведений об узле, которая выглядит примерно так:

<nid>23</nid>
<timestamp>1345634</timestamp>
<name>Some Name</name>
<synonym_nids>
 <item>
  45
 </item>
 <item>
  85
 </item>
</synonym_nids>

Я создал RKManagedObjectMapping с моим подклассом NSManagedObject, который должен поддерживать указанную выше структуру. Упомянутые выше ниды (оба <nid> и <synonym_nids>) уникальны. Коллекция синонимов сама по себе должна иметь уникальные идентификаторы.

Я мог бы пометить <nid> как уникальный во время сопоставления с помощью API -setPrimaryKeyAttribute с сопоставлением XML основного уровня с подклассом NSManagedObject. Я проверяю значение метки времени в локальном объекте и сравниваю его с возвращенным <timestamp> из API листинга и отмечаю объект как «грязный», только если метка времени устарела. Затем я получаю сведения только о тех узлах, для которых установлен «грязный бит». Показанный выше XML является извлечением из подробного API. Теперь, когда грязный бит установлен и когда получение подробного API завершено, я в конечном итоге добавляю несколько идентификаторов синонимов в набор отношений, потому что в Restkit нет механизма (согласно моему исследованию до сих пор), чтобы проверить, соответствует ли nid 45 и 85 (в данном случае) уже существуют в наборе отношений. Итак, естественно, Restkit добавляет несколько записей для nid 45 и 85 каждый раз, когда объект помечается как «грязный». Кроме того, поскольку нет встроенного механизма для прямого ввода NSNumber внутри отношения NSSet (один ко многим) с использованием основных данных, я создал объект-оболочку вокруг NSNumber, который является подклассом NSManagedObject, чтобы добавить его в набор отношений.

Объект модели выглядит следующим образом:

@interface NGArticle : NSModelBase <NGArticleObjectMappingProtocol>
@property (nonatomic, retain) NSNumber * nodeID; // <nid>
@property (nonatomic, retain) NSString * prominentCommonName; // <name>
@property (nonatomic, retain) NSDate * lastChanged; // <timestamp>
@property (nonatomic, retain) NSSet *lookAlike; // <synonym_nids>
@end

@interface NGArticle (CoreDataGeneratedAccessors)
-(void)addLookAlikeObject:(NGInteger64*)value;
-(void)removeLookAlikeObject:(NGInteger64*)value;
-(void)addLookAlike:(NSSet*)values;
-(void)removeLookAlike:(NSSet*)values;
@end

Как мне эффективно справиться с этим случаем? Есть ли в Restkit какие-либо встроенные возможности для обработки таких сценариев?

Обновление:

Структура объекта Nginteger64:

@interface NGInteger64:NGModelBase
@property (nonatomic, retain) NSNumber *number; // This number is of Integer 64 type which is set in managed object model's xcdatamodel file.
@end

Обратите внимание, что NGModelBase является подклассом NSManagedObject и, следовательно, NGArticle и NGInteger64 также являются подклассами NSManagedObject.


person Raj Pawan Gumdal    schedule 18.09.2013    source источник


Ответы (1)


Restkit заканчивает тем, что каждый раз добавляет несколько записей для nid 45 и 85.

Это означает, что вы не научили RestKit находить существующие экземпляры сущностей для указанного идентификатора. В этом случае RestKit создает новые объекты и добавляет их в отношения.

Я мог бы пометить как уникальный во время сопоставления

Да, вы должны сделать это, чтобы избежать дубликатов. Имя, указанное для setPrimaryKeyAttribute, должно быть атрибутом объекта (а не исходным ключом в XML), поэтому nodeID.

person Wain    schedule 19.09.2013
comment
Да, я избегаю дубликатов на уровне узла, помечая их как первичный ключ с помощью -setPrimaryKeyAttribute, но я не уверен, как избежать добавления дубликатов записей в набор «lookAlike», используя это, какие-либо наводки, которые у вас есть для меня? - person Raj Pawan Gumdal; 19.09.2013
comment
Что такое NGInteger64, ему тоже нужен определенный уникальный идентификатор. - person Wain; 19.09.2013
comment
NGInteger64 — это просто объект-оболочка вокруг NSNumber, потому что мы не можем указать NSNumber в качестве места назначения для отношения в файле xcdatamodel. У него есть только одна переменная-член NSNumber. Однако объект NGInteger64, который в этом случае будет иметь ссылки nid 45 и 85, не должен добавляться несколько раз в набор «lookAlike». - person Raj Pawan Gumdal; 20.09.2013
comment
Обновлен вопрос, чтобы добавить больше деталей. - person Raj Pawan Gumdal; 20.09.2013
comment
Вы установили number в качестве уникального идентификатора для NGInteger64 в сопоставлении? - person Wain; 20.09.2013
comment
Нет, я не устанавливал номер в качестве уникального идентификатора для сопоставления NGInteger64. Это позволит избежать добавления нескольких записей объектов NGInteger64 с одинаковым номером в набор «lookAlike»? - person Raj Pawan Gumdal; 20.09.2013