2011-07-17 5 views
0

私は、プログラムでコアデータオブジェクトを更新する方法を知りたいと思います。しかし、オブジェクトはNSSetです。だから私は、以下のスキームでこれをまとめることができます。プロパティとProperty_has_typologyの間に1対多の関係がありコアデータを使用してNSSet(一対多)を格納する方法は?

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

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

。 1つのプロパティとしてBed &朝食、ヴィラ、ホテル、マンション、カントリーハウスなどのいくつかの類型(別名カテゴリ)を持つ可能性があります。

テーブルビューで複数の行を選択させ、をクリックしてを保存すると、これらの変更を保存します。だから私は実行します。

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つの項目を保存するのであれば:(

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

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

ご協力いただければ幸いです。ありがとう!

答えて

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. 

謝罪はありますか。私は現時点で私の窓のマシン上にあるので、私はそれを確認することはできません。

+0

'deleteObject'は実際に私が探していたものです。今私はすべてのエントリを完全に削除し、新しいものを挿入することができます。ありがとう! – Jules

0

TechZen:親が記述した多対多の関係を逆転したことに気がつきました。しかし、すべてが同じように機能します。私は時間を見つけたら編集します。

あなたは、Core Dataが自動的に行うことを手動で行うことにより、頑張っています。リレーションシップを設定するには、その片側を設定するだけで、マネージドオブジェクトコンテキストが自動的に他のリレーションシップを設定します。あなたは、このようなデータモデルを持っている場合

ので、:

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

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

が続いProperty物体側から関係を設定するには、あなただけの使用:

aPropertyObject.typology=aProperty_has_typologyObject; 

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

[aProperty_has_typologyObject addPropertiesObject:aPropertyObject]; 

または

[aProperty_has_typologyObject addPropertiesObjects:aSetOfPropertyObjects]; 

...そして、あなたが行われています。

すべてのオブジェクトリレーションシップを手作業で管理する必要がある場合、コアデータはあまり有用ではありません。

+0

はいこれらの機能をすべて設定しましたが、これらのメソッドを使用すると、データベース内の他のメソッドへの参照が格納されます。ですから、私は '[property addTypologyObject:typo];'を行いますが、それはちょうど** **追加するようです。 '[property removeTypology:property.typology];を実行しても(私はTypology参照のセット全体を削除する必要があります)、私の質問に記述されているようにデータベースにレコードを保持します。 – Jules

+0

リレーションシップからオブジェクトを削除しても削除されず、リレーションシップが削除されます。オブジェクトを削除するには、 '[NSManagedObjectContext deleteObject:]'を使用する必要があります。 – TechZen

+0

'addTypologyObject'というメソッドを使用したときに何が起こると思いますか?私は、あなたがCore Dataについて批判的なことを誤解していると思います。あなたが言わなければならないと思うように、あなたが言及している方法のどちらも機能しません。 – TechZen

関連する問題