Ваша основная проблема раскрывается жирными фразами ниже:
Я еще раз прочитал через Apple
Документация разработчика Core Data и
нашел его не хватает, когда дело доходит до
графический редактор Xcode 4 при создании
SQLLite лица столько, сколько я нашел
не хватает, когда IB был отдельным в Xcode
3.
Три таблицы:
ZipData LocationData CrossReference
CrossReference имеет первичный ключ из
ZipData и LocationData, поэтому я только
нужно запросить CrossReference, чтобы получить
все молнии для локаций или все
места для молний.
Не существует такой вещи, как SQLite entities
, а в Core Data нет таблиц или первичных ключей.
Базовые данные не являются SQL. Сущности не являются таблицами. Объекты не являются строками. Атрибуты не являются столбцами. Отношения не объединяются. Базовые данные - это система управления графом объектов , которая может сохранять или не сохранять объектный граф и может или не может использовать SQL далеко за кулисами для этого. Попытка представить базовые данные в терминах SQL приведет к тому, что вы полностью неправильно поймете базовые данные и приведет к большим трудностям и потерянному времени.
Вы делаете ошибку, типичную для специалистов по SQL. Вы предполагаете, что Core Data - это облегченная оболочка объекта для процедурного SQL. Это не. Хранилище SQLite - это всего лишь один из четырех вариантов сохранения, а сама модель данных полностью не зависит от того, какой вариант сохранения вы выберете, т. Е. Та же модель будет работать со всеми типами хранилищ. В магазинах просто разные средства архивации и де-архивирования (сублимационной сушки и регидратации) графика живых объектов. То, как конкретный график сохраняется, является скрытой деталью реализации, которую вы можете игнорировать в подавляющем большинстве случаев. Просто забудьте все, что вы знаете о SQL, потому что он не поможет вам понять основные данные.
Ваша конкретная проблема в том, что вы никогда не устанавливаете отношения между объектами. Вам необходимо создать CrossReference
объект и установить его отношения, таким образом;
NSManagedObject *crossReference = [NSEntityDescription
insertNewObjectForEntityForName:@"CrossReference"
inManagedObjectContext:context];
[crossReference setValue:locationData forKey:@"location"];
[crossReference setValue:zipCodeData forKey:@"zipCode"];
Контекст будет гарантировать, что взаимные отношения установлены для связанных объектов LocationData
и ZipData
.
Ключ к овладению Базовыми данными заключается в том, чтобы игнорировать форму постоянства и вместо этого думать только с точки зрения объектов с атрибутами и связями. Как только вы действительно усвоите эту концепцию, все легко встанет на свои места.