2012-03-15 5 views
0

Я хочу хранить NoteObjects в Core Data. Обычно NoteObject имеет NSString *mainText и NSMutableArray *arrayOfTags (массив NSStrings). Я хочу теперь использовать Core Data, но массивы - сложный вопрос с основными данными. Обычно NoteObject не будет содержать более 50 тегов в своем массиве. Итак, как я должен это моделировать? У меня есть два варианта:Как смоделировать объект Core Data?

  1. Используйте transformable свойства хранить массив со
  2. Используйте ко-многим, которые я читал, тем больше «законного» способ сделать это.

Какой я должен использовать и почему? И как мне реализовать отношение «многие» к моей простой структуре? Кажется, я не могу обмануть эту концепцию.

+0

Вы уверены, что CoreData - правильный подход - посмотрели ли вы на NSCoding, если ваши данные достаточно малы? Если у вас есть большой набор данных, то следуйте ответам @Eugene :) – deanWombourne

ответ

4

Используйте для многих отношений. Потому что это намного проще и проще во время запросов на выборку. Смотрите скриншоты ниже. Обратите внимание на менеджера отношений с правой стороны, установите «To-Many Relationship» из вашего объекта NoteObject в теги. Игнорируйте объект Player.

О, и обратите внимание на «Удалить правило». Вы можете удалить все теги, связанные с данным объектом NoteObject. Тогда установите его в Cascade.

NoteObject объект enter image description here

Tag объект enter image description here

--edit:

Чтобы добавить несколько тегов, нужно сначала принести свой NoteObject - Я полагаю, что будет какой-то параметр ID, который вам Используется для отличия NoteObjects. CoreData автоматически генерирует методы добавления/удаления для тегов. Вам нужно будет использовать код, аналогичный приведенному ниже:

- (void)addTags:(NSArray *)tags toNoteObjectWithID:(NSString *)noteID { 
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"NoteObject"]; 
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"noteID == %@", noteID]; 
    [fetchRequest setPredicate:pred]; 
    NoteObject *noteObject = [[[self managedObjectContext] executeFetchRequest:fetchRequest error:nil] lastObject]; 

    for (NSString *tag in tags) { 
    Tag *t = [NSEntityDescription insertNewObjectForEntityForName:@"Tag" 
              inManagedObjectContext:[self managedObjectContext]]; 
    t.body = tag; 
    t.noteObject = noteObject; 
    [noteObject addTagsObject:t]; 
    } 
    [self saveContext]; 
} 
+0

Итак, как я могу добавить несколько тегов к объекту заметки? – Snowman

+0

@mohabitar изменил ответ – Eugene

+0

Удивительный, спасибо. Кроме того, мне нужно генерировать файлы классов для объекта Tag? – Snowman

1

Вы можете использовать свойство transformable, но тогда вам нужно написать трансформатор.

Если вы используете отношения toMany, вам необходимо создать дополнительный объект для тегов, который предположительно имеет только один атрибут - строковое значение и одно отношение. Экстраполируя немного, я бы предположил, что у вас есть конечный набор значений, которые могут принимать теги, и вы можете когда-нибудь захотеть всех заметок, имеющих тег X, - тогда вы сможете получить объект, содержащий строковое значение для X, а затем использовать что для получения NSArray объектов, которые имеют X в отношении (как вы его называли).

1

Массивы были сложными в Core Data, потому что они не поддерживались до iOS 5, поэтому вам нужно было включить некоторый атрибут (например, дату создания), с помощью которого они могли быть отсортированы. Если вы не против iOS 5, вы можете использовать ordered relationships. Результаты возвращаются в NSOrderedSet, который очень похож на (и может быть преобразован) на массив. Или просто переосмыслить проблему - это порядок тегов на заметке, важной для заметки или пользователя? Было бы хорошо, если бы вы просто отображали теги в алфавитном порядке? Если это так, еще лучше - просто используйте обычное старое (неупорядоченное) отношение ко многим.

Смежные вопросы