Как смоделировать мою сущность Core Data? - PullRequest
0 голосов
/ 15 марта 2012

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

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

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

Ответы [ 3 ]

4 голосов
/ 15 марта 2012

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

Да, и обратите внимание на «Правило удаления». Возможно, вы захотите удалить все теги, связанные с данным NoteObject. Так что в этом случае установите его на Cascade.

ПримечаниеОбъектное лицо enter image description here

тег сущности 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];
}
1 голос
/ 15 марта 2012

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

1 голос
/ 15 марта 2012

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

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

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