Основные данные: хранение упорядоченных значений в соотношении «один ко многим»

#core-data

Вопрос:

Я создаю приложение для тренировок, в котором есть объект под названием Workout, а другой — Exercise. Тренировка может содержать несколько упражнений (таким образом, соотношение «один ко многим»). Я хочу показать пользователям моего приложения упражнения, содержащиеся в тренировке, но в упорядоченном виде (начинать с силовых упражнений не то же самое, что с кардио-упражнений).

По-видимому, при установлении такого рода отношений в основных данных мне нужно использовать an NSSet , потому что, если я попытаюсь использовать, например, an Array , где его элементы упорядочены, я получаю следующую ошибку:

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for to-many relationship: property = "consistsOf"; desired type = NSSet; given type = __NSArray0; value = (
).'
 

Я попытался установить флажок «упорядоченный» в моей модели, но затем я получаю сообщение об ошибке «Workout.consistsOf не должен быть упорядочен».
Я также пытался использовать an NSDictionary , ключами которого будет позиция, а значениями будут сами упражнения, но я получаю ту же ошибку, что и выше.

Как я могу показать пользователям упражнения, из которых состоит тренировка, в упорядоченном виде?

Заранее большое спасибо!

P.S.: Вот скриншот свойств моей модели.

свойства модели
ошибка

Комментарии:

1. Я думаю, что проверка «упорядоченный» заставляет Core Data использовать NSOrderedSet

2. действительно, это так, и после преобразования моего свойства в значение an NSORderedSet я все еще получаю: Workout.consistsOf must not be ordered [8] . Я также понял, что заголовок ошибки гласит CloudKit integration

3. Хорошо, тогда это другая ситуация. Я не эксперт по CloudKit, так как я только начал его использовать, но это, безусловно, влияет (добавляет больше ограничений) на то, что вы можете делать с основными данными. Другим вариантом, конечно, является добавление собственного свойства order в Exercise.

4. Боюсь, что это одна из тех маленьких проблем, из-за которой CloudKit не поддерживает сопоставление OrderedSet (NS) — по крайней мере, это то, что я обнаружил, когда столкнулся с той же проблемой в прошлом году:-/. Большинство людей, похоже, обходят ограничение, добавляя дополнительный атрибут приоритета к объекту, который нуждается всортировка (а не что-то более сложное, например, связанный список или подобное).

5. Вот еще немного подтверждений предыдущего комментария и предложения по альтернативным подходам appsdissected.com/order-core-data-entities-maximum-speed

Ответ №1:

Упорядоченные отношения используются NSOrderedSet , но CloudKit не поддерживает упорядоченные наборы, поэтому вы не можете использовать упорядоченные отношения и CloudKit в одной модели данных.

Чтобы сохранить порядок, вам необходимо иметь некоторое свойство Exercise , которое указывало бы порядок. Это может быть так же просто, как свойство integer, называемое чем-то вроде index . Вы бы отсортировали результат на основе значения индекса. Если есть что-то еще, что также указывает порядок — например, дата, может быть?— используйте это вместо добавления нового свойства.

Комментарии:

1. спасибо за информацию! В итоге я создал промежуточную таблицу, которая добавляет порядок выполнения упражнения в тренировке