0

CoreDataオブジェクトをプログラムで更新するにはどうすればよいのでしょうか。ただし、オブジェクトはNSSetです。だから私はこれを以下のスキームで要約することができます:

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

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

プロパティとProperty_has_typologyの間には1対多の関係があります。1つのプロパティには、Bed&Breakfast、Villa、Hotel、Mansion、Country Houseなどのいくつかの類型(別名カテゴリ)がある場合があります。

そこで、ユーザーにTableViewで複数の行を選択させ、[保存]をクリックしたときにこれらの変更を保存します。私もです:

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];
}

これはちょっと機能しますが、問題は、既存の値を実際には更新しないことです。それはそれを上書きするだけです。したがって、同じ2つのアイテムを2回保存すると(例として)、データベースに次のようになります。

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

つまり、それらは保存されていますが、空の行も作成されます(削除/更新する代わりにそれらをクリアします)。

どんな助けでもいただければ幸いです。ありがとう!

4

2 に答える 2

0
//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マシンを使用しているため、確認できません。

于 2011-07-17T23:15:26.013 に答える
0

TechZenのコメント:親が説明した多対多の関係を逆転させたという事実の後で気づきました。ただし、すべてが同じように機能します。時間があれば編集します。

Core Dataが自動的に行うことを手動で行うことで、一生懸命取り組んでいます。関係を設定するには、その一方を設定するだけで、管理対象オブジェクトのコンテキストがもう一方を自動的に設定します。

したがって、次のようなデータモデルがある場合:

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

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

次に、Property使用するオブジェクト側から関係を設定するには、次のようにします。

aPropertyObject.typology=aProperty_has_typologyObject;

オブジェクト側から、Core Dataが生成した実装(.m)でリレーションシップアクセサーメソッドを使用するかどうかを設定するには、Property_has_typology次のようにします。

[aProperty_has_typologyObject addPropertiesObject:aPropertyObject];

また

[aProperty_has_typologyObject addPropertiesObjects:aSetOfPropertyObjects];

...これで完了です。

すべてのオブジェクトの関係を手動で管理する必要がある場合、CoreDataはあまり有用ではありません。

于 2011-07-18T17:45:02.803 に答える