Как сохранить NSSet (один-ко-многим) с использованием Core Data? - PullRequest
0 голосов
/ 18 июля 2011

Мне интересно, как я могу программно обновить объект Core Data. Объект является NSSet, хотя. Таким образом, я могу суммировать это со схемой ниже:

Property
---------
name
price
typology

Property_has_typology
---------------------
typology_id
property

Между Property и Property_has_typology существует отношение один ко многим. Как одна собственность может иметь несколько типологий (или категории), такие как Bed & Breakfast, Villa, Hotel, Mansion, Country House.

Поэтому я позволяю пользователю выбрать несколько строк в моем TableView, и когда он нажимает save , я хочу сохранить эти изменения. Итак, я делаю:

NSMutableArray *storeItems = [[NSMutableArray alloc] init];

//Get selected items
for (int i = 0; i < [items count]; i++) {
     Properties_has_typology *typo = [NSEntityDescription insertNewObjectForEntityForName:@"Properties_has_typology" 
                                                                    inManagedObjectContext: [PropertyProvider sharedPropertyProvider].context];
     typo.typology_id = [NSNumber numberWithInt: (int)[items objectAtIndex:i]];
     typo.property = property;
     [storeItems addObject: typo];
}

//Store the items for the Property and save it
if ([storeItems count] > 0) {
    NSLog(@"Going to save...");
    NSSet *storeSet = [[NSSet alloc] initWithArray:storeItems];
    property.typology = storeSet;

    [property save];

    [storeSet release];
}

Это вроде работает, но проблема в том, что он не обновляет существующие значения. Это просто отменяет это. Поэтому, если я сохраню два одинаковых элемента дважды (просто в качестве примера), я получу в своей базе данных следующее:

PK  TYPOLOGY
------------
1 | 
2 |   
3 |  4
4 |  6

Так что, да, они хранятся, но это также создает пустые строки (очищает их вместо удаления / обновления).

Любая помощь будет принята с благодарностью. Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 июля 2011

TechZen говорит: Я только что заметил после того, как изменил отношение ко многим, которое описал родитель. Однако все работает так же. Я буду редактировать, когда найду время.

Вы усердно работаете, выполняя действия, которые Core Data выполняет автоматически. Чтобы установить отношение, вы просто устанавливаете одну его сторону, а контекст управляемого объекта устанавливает другую автоматически.

Итак, если у вас есть такая модель данных:

Property{
    typology<<-->Property_has_typology.properties
}

Property_has_typology{
    properties<-->>Property.typology
}

Затем, чтобы установить связь со стороны объекта Property, которую вы просто используете:

aPropertyObject.typology=aProperty_has_typologyObject;

Чтобы установить, используете ли вы со стороны объекта Property_has_typology методы доступа к отношениям в реализации (.m), которую Основные данные сгенерировали для вас:

[aProperty_has_typologyObject addPropertiesObject:aPropertyObject];

или

[aProperty_has_typologyObject addPropertiesObjects:aSetOfPropertyObjects];

... и все готово.

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

0 голосов
/ 18 июля 2011
//call 
NSArray* oldTypos = [property.typology allObjects];
[[property removeTypology:[PropertyProvider sharedPropertyProvider].context];
[[property addTypology:storeSet];
for(int i = 0; i < [oldTypos count]; i++){
[[PropertyProvider sharedPropertyProvider].context deleteObject:[oldTypos:objectAtIndex:i]];
}
Error* error = nil;
if(![[PropertyProvider sharedPropertyProvider].context save:&error]){
abort();
}
//Also, rename the to-many relationship to plural.

Извинения за любые опечатки. В данный момент я нахожусь на своем компьютере с Windows, поэтому не могу проверить его.

...