Я бы создал три сущности: Supermarket, Product и SupermaketProductDetails со следующими атрибутами и отношениями:
Supermarket:
Attributes: name, location, phone number
Relationship (to many): productDetails
Product:
Attributes: name, price, company
Relationship (to many): supermarketDetails
SupermarketProductDetails:
Attributes: priceofProductforGivenMarket, primaryProductforGivenMarket
Relationships: (to one) supermarket, (to one) product
В Xcode укажите, что «назначением» для отношения productDetails в сущности Supermarket является сущность SupermarketProductDetails с обратным супермаркетом, аналогичным образом установите сущность SupermarketProductDetails в качестве места назначения для supermarketDetails в сущности Product с обратным продуктом.
Затем я бы сначала проанализировал ваши данные JSON для супермаркетов, создав объекты Supermarket и установив имя, местоположение и номер телефона, но ничего не вводя для отношения продуктов. Аналогичным образом проанализируйте продукты JSON и создайте все объекты продуктов. Затем я анализировал таблицу соединений и создавал объекты SupermarketProductDetails. Установите атрибуты на основе ваших данных JSON и выполните выборку, чтобы получить сущность Supermarket с правильным именем, аналогичным образом извлеките сущность Product с правильным именем, а затем установите эти отношения напрямую.
РЕДАКТИРОВАТЬ: предположим, что вы анализируете каждую строку в вашей таблице соединений на четыре строки NSString: nameofsupermarket, nameofproduct, priceofProductforGivenMarket и primaryProductforGivenMarket. Затем для каждой строки...
// First fetch the correct Supermarket...
NSFetchRequest *supermarketFetch = [NSFetchRequest fetchRequestWithEntityName:@"Supermarket"]
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@",nameofsupermarket];
supermarketFetch.predicate = predicate;
NSError *error;
NSArray *results = [context executeFetchRequest:supermarketFetch error:&error];
// should really check for errors, and that we get one and only one supermarket
NSLog(@"Supermarket fetch returned %i results",[results count]); // should be only 1!
mySupermarket = (NSManagedObject *)[results firstObject];
if (![[mySupermarket valueForKey:@"name"] isEqualToString:nameofsupermarket]) {
NSLog(@"Wrong supermarket fetched");
}
// Now fetch the product...
NSFetchRequest *productFetch = [NSFetchRequest fetchRequestWithEntityName:@"Product"]
predicate = [NSPredicate predicateWithFormat:@"name like %@",nameofproduct];
productFetch.predicate = predicate;
results = [context executeFetchRequest:productFetch error:&error];
// should really check for errors, and that we get one and only one product
NSLog(@"Product fetch returned %i results",[results count]); // should be only 1!
myProduct = (NSManagedObject *)[results firstObject];
if (![[myProduct valueForKey:@"name"] isEqualToString:nameofproduct]) {
NSLog(@"Wrong product fetched");
}
// Now create the SupermarketProductDetails entity:
NSManagedObject *mySupermarketProductDetails = [NSEntityDescription insertNewObjectForEntityForName:@"SupermarketProductDetails" inManagedObjectContext:context];
// set attributes...
[mySupermarketProductDetails setValue:primaryProductForGivenMarket forKey:@"primaryProductForGivenMarket"];
[mySupermarketProductDetails setValue:priceOfProductForGivenMarket forKey:@"priceOfProductForGivenMarket"];
// set relationships...
[mySupermarketProductDetails setValue:mySupermarket forKey:@"supermarket"];
[mySupermarketProductDetails setValue:myProduct forKey:@"product"];
[context save:&error];
// should check for errors...
Обратите внимание, что вам нужно установить только одну сторону этих отношений — CoreData обновит другую сторону для вас (т. е. добавит mySupermarketDetails к набору supermarketDetails для myProduct и т. д.). Также обратите внимание, что «значение» для отношения (к одному) (например, супермаркет) — это сам целевой объект (например, мойСупермаркет); вы не используете имя или любой другой ключ. Coredata (скрытый в базовых таблицах sql) использует уникальные идентификаторы объектов для связывания.
(Возможно, есть более эффективные способы сделать это, чем делать две выборки для каждой записи SupermarketProductDetails, но это сработает.)
EDIT2: обратите внимание, что вышеизложенное предполагает, что все ваши объекты реализованы как NSManagedObjects. Если вы создали отдельные подклассы для каждой сущности, вы можете упростить часть приведенного выше кода. Например, valueForKey: и setValue:forKey: можно заменить эквивалентными методами доступа к свойствам с использованием записи через точку, например:
[mySupermarketProductDetails setValue:primaryProductForGivenMarket forKey:@"primaryProductForGivenMarket"];
станет:
mySupermarketProductDetails.primaryProductForGivenMarket = primaryProductForGivenMarket;
и
[mySupermarket valueForKey:@"name"]
можно заменить на:
mySupermarket.name
Точно так же объекты должны создаваться с использованием соответствующего подкласса, а не NSManagedObject. например.
NSManagedObject *mySupermarketProductDetails = [NSEntityDescription insertNewObjectForEntityForName:@"SupermarketProductDetails" inManagedObjectContext:context];
станет
SupermarketProductDetails *mySupermarketProductDetails = [NSEntityDescription insertNewObjectForEntityForName:@"SupermarketProductDetails" inManagedObjectContext:context];
person
pbasdf
schedule
21.09.2014