iOS: основные данные: как сохранить упорядоченный набор объектов в управляемом объекте - PullRequest
4 голосов
/ 12 марта 2011

У меня есть NSManagedObject в моем приложении для iOS.Этот объект называется Раунд.В раунде у меня есть отношение ко-многим с кучей объектов Person.

xCode генерирует мой класс управляемых объектов, используя NSSet как тип данных моего отношения ко-многим с управляемыми объектами Person.

Таким образом, мой управляемый объект Round выглядит следующим образом:

@interface Round :  NSManagedObject  
{
}

@property (nonatomic, retain) NSSet* people;

@end

Однако NSSet не является упорядоченной коллекцией, и я хочу сохранить порядок NSArray, который я использую для хранения этих объектов Person при назначенииэто мой управляемый объект Round.

Я попытался просто преобразовать NSArray в NSSet, однако первоначальный порядок набора не сохранился.

Я попытался изменить тип с NSSet на NSArray в моемВокруг управляемого объекта получена следующая ошибка во время выполнения.

2011-03-11 14:00:06.950 SkeetTracker[42782:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: **'Unacceptable type of value for to-many relationship: property = "people"; desired type = NSSet; given type = __NSArrayM;** value = (
    " (entity: Person; id: 0x5bed0c0  ; data: {\n    firstName = Todd;\n    lastName = McFarlane;\n    round = \"0x5bf2cb0 \";\n    scores = \"\";\n})",

Кто-нибудь когда-либо сталкивался с такой вещью и знал о решении?

С уважением, Джордж

Ответы [ 3 ]

3 голосов
/ 20 февраля 2012

Я полагаю, что iOS 5 на самом деле встроил его - но независимо от того, если вы хотите постоянный отсортированный порядок, вам нужно иметь сохраненный атрибут, из которого вы можете создать NSSortDescription. Затем вы добавляете еще один метод (я предпочитаю свойство только для чтения, чтобы я тоже мог получить к нему доступ через точку), который возвращает массив [NSSet sortedArrayUsingDescriptors:self.unsortedSetMethod].

2 голосов
/ 12 марта 2011

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

0 голосов
/ 13 марта 2011

Спасибо за отличную идею. Я думаю, что в моем случае я могу просто добавить свойство index к элементам моего массива (они также являются управляемыми объектами) и сделать индекс переходным свойством.

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

...