#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. спасибо за информацию! В итоге я создал промежуточную таблицу, которая добавляет порядок выполнения упражнения в тренировке