Xcode4 Core Data Relationships - PullRequest
       6

Xcode4 Core Data Relationships

2 голосов
/ 29 июня 2011

Я еще раз прочитал документацию по Core Data для разработчика Apple и обнаружил, что в ней нет графического редактора Xcode 4 при создании сущностей SQLLite, так же, как я обнаружил, что этого нет, когда IB был отдельным в Xcode 3.

Три стола:

  • ZipData
  • LocationData
  • CrossReference

CrossReference имеет первичный ключ ZipData и LocationData, поэтому мне нужно только запросить CrossReference, чтобы получить все почтовые индексы для местоположений или все местоположения для почтовых индексов. Это, конечно, означает отношение ко многим в ZipData и LocationData (и, возможно, в CrossReference?).

Что я имею (что не работает) в отношении отношений, так это:

  • ZipData имеет отношение "местоположения", которое указывает на LocationData и является обратным
  • LocationData имеет отношение "zipsCodes", которое указывает на ZipData и является обратным
  • Таблица перекрестных ссылок имеет две взаимосвязи: одна с ZipData (и обратная), а другая с LocationData (и обратная).

Я пока не подразделяю ни одну из сущностей на NSManagedObjects. Я просто делаю код ниже в методе viewDidLoad, просто чтобы посмотреть, работает ли то, что у меня есть.

// test/learn the core data frame work
NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *locationData = [NSEntityDescription
                                   insertNewObjectForEntityForName:@"LocationData" 
                                   inManagedObjectContext:context];
[locationData setValue:@"Testville" forKey:@"City"];
[locationData setValue:@"United Tests" forKey:@"Country"];
[locationData setValue:@"County of Test" forKey:@"County"];
NSManagedObject *zipCodeData = [NSEntityDescription
                                      insertNewObjectForEntityForName:@"ZipCodeData" 
                                      inManagedObjectContext:context];
[zipCodeData setValue:[NSNumber numberWithDouble:1111.00] forKey:@"Income"];
[zipCodeData setValue:[NSNumber numberWithDouble:22.00] forKey:@"LandArea"];
[zipCodeData setValue:@"23060" forKey:@"ZipCode"];
NSError *error;
if (![context save:&error]) {
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"CrossReference" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *info in fetchedObjects) {
    NSLog(@"LocationId: %@", [info valueForKey:@"LocationDataId"]);
    NSManagedObject *details = [info valueForKey:@"details"];
    NSLog(@"ZipId: %@", [details valueForKey:@"ZipCodeDataId"]);
}        
[fetchRequest release];

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

Я ничего не получаю обратно в журналах, хотя при просмотре симуляторов sqllite db я вижу, что тестовые объекты сохранились (но ничего в CrossReference). Я знаю, что упускаю что-то мудрое в отношениях, но не могу понять, что это.

1 Ответ

7 голосов
/ 29 июня 2011

Ваша основная проблема раскрывается жирными фразами ниже:

Я еще раз прочитал через 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.

Ключ к овладению Базовыми данными заключается в том, чтобы игнорировать форму постоянства и вместо этого думать только с точки зрения объектов с атрибутами и связями. Как только вы действительно усвоите эту концепцию, все легко встанет на свои места.

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