Разделение данных является правильным ответом на сегодняшний день. Справочные данные не следует синхронизировать с облаком, тем более что в iCloud есть мягкие ограничения, позволяющие приложению синхронизировать и хранить в документах.
Чтобы создать мягкие ссылки на хранилища (они не обязательно должны быть SQLite, но это хорошая идея для общей производительности приложения), вам потребуется какой-то уникальный ключ, на который можно ссылаться с другой стороны; старый добрый внешний ключ.
Оттуда вы можете создать извлеченное свойство в модели для ссылки на сущность.
Хотя это отношение нельзя упорядочить напрямую, вы можете создать порядок с помощью индекса сортировки или, если оно имеет логическую сортировку, вы можете отсортировать его после извлечения данных (для этого я использую удобные методы, которые возвращают отсортированный массив вместо установлен).
Я могу создать пример, но вы действительно на правильном пути. Единственная забавная часть - это миграция. Когда вы обнаружите ситуацию миграции, вам нужно будет перенести каждое хранилище независимо до того, как вы создадите свой базовый стек данных. Это звучит сложно, но на самом деле это не так сложно сделать.
Пример
Представьте, что у вас есть сущность UserBar в хранилище пользователей и сущность RefBar в хранилище ссылок. Затем RefBar будет иметь «связь» fetchedProperty с UserBar, создавая тем самым связь ToOne.
UserBar
----------
refBarID : NSInteger
RefBar
--------
identifier : NSInteger
Затем вы можете создать извлеченное свойство для сущности RefBar в моделере с предикатом:
$ FETCHED_PROPERTY.refBarID == идентификатор
Позволяет назвать предикат "userBarFetched"
Теперь это вернет массив, поэтому мы хотим добавить вспомогательный метод в RefBar
@class UserBar;
@interface RefBar : NSManagedObject
- (UserBar*)userBar;
@end
@implementation RefBar
- (UserBar*)userBar
{
NSArray *fetched = [self valueForKey:@"userBarFetched"];
return [fetched lastObject];
}
@end
Создать ToMany тоже самое, за исключением того, что ваш удобный метод вернул бы массив, и вы должны отсортировать массив перед его возвратом.
Как упоминалось Heath Borders , можно добавить сортировку к NSFetchedProperty
, если вы хотите, но вы должны сделать это в коде. Лично я всегда считал это расточительным и не использую эту функцию. Возможно, было бы более полезно, если бы я мог установить сортировку в моделере.
Использование ObjectID
Я не рекомендую использовать ObjectID или URIRпредставление. ObjectID (и, следовательно, представление URIR этого ObjectID) может и будет изменяться. Всякий раз, когда вы переносите базу данных, это значение будет меняться. Вам гораздо лучше создать неизменяемый GUID.
Слабые отношения
Вам нужно только одно значение на стороне M отношения, в котором хранится внешний идентификатор. В вашем подклассе объектов вам нужно только реализовать средства доступа, которые извлекают объект (или объекты).