コアデータ:対多関係の再設定
-
18-09-2019 - |
質問
そこで見ることができるモデルを作成しました。http://i.imagehost.org/0836/2009-11-08_14_37_41.png
サウンドのカテゴリに関する情報と、各カテゴリのサンプルサウンドを保存したいと考えています。カテゴリには、Name (NSString) と SoundsRelation (サウンドを表す NSData の NSSet) があります。
問題は次のとおりです。たとえば、いくつかのカテゴリに関連付けられたサウンドが含まれているとします。音の数が3であると仮定します。それで、私がそうするなら
NSLog(@"description: \n%@", category);
名前とこれら 3 つの音に関する情報が表示されます。このようなもの:
Name = "Cat1";
SoundsRelation = (
0x174e90 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p9>,
0x174ea0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p10>,
0x174eb0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p11>
);
次に、このカテゴリの音をクリアしたいと思います。SoundsRelationをnilに設定したいと思います。
私はします:
[category setValue:nil forKeyPath:@"SoundsRelation"];
今私がそうすれば
NSLog(@"description: \n%@", category);
次のようなものになります:
Name = "Cat1";
SoundsRelation = (
);
そうですね、Cat1 には関連するサウンドがないようです。
今、私はmanagedObjectContextを使用して保存します [managedObjectContext save:]
方法と アプリを終了する.
アプリを再起動して実行すると、
NSLog(@"description: \n%@", category);
私は次のものを持っています:
Name = "Cat1";
SoundsRelation = (
0x174e90 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p9>,
0x174ea0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p10>,
0x174eb0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p11>
);
以前のサウンドが表示されます。
ここで、他の 5 つのサウンドを含む他の NSSet で SoundsRelation をオーバーライドすると、次のようになります。[カテゴリ setValue:otherSetWithFiveSounds forKeyPath:@"SoundsRelation"];
そして、やります:NSLog(@"説明: %@", カテゴリ);
なるほど:名前 = "Cat1";soundrelation =(0x174e90、0x174ef0、0x174ab0、0x1743b0、0x1744b0);
カテゴリを NSLogging した後、保存して終了し、再起動すると、次のように表示されます。
Name = "Cat1";
SoundsRelation = (
0x174e90 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p9>,
0x174ea0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p10>,
0x174eb0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p11>,
0x174e90 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p12>,
0x174ef0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p13>,
0x174ab0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p14>,
0x1743b0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p15>,
0x1744b0 <x-coredata://2E783972-3772-4CCA-9676-1D5F732D1FD2/Sounds/p16>
);
古いサウンドと新しいサウンドが見えます!なぜ?古い関係を新しい関係に完全にオーバーライドするにはどうすればよいですか?
解決
この行:
[category setValue:nil forKeyPath:@"SoundsRelation"];
ManagedObjectContextからの音を削除しません。それはちょうどカテゴリオブジェクトとサウンドオブジェクト間の連携を壊します。それは永続ストアに孤立したオブジェクトを作成するためCoreDataはそれを好きではありません。あなたが再起動すると、CoreDataはエラーがオブジェクトを孤立し、それが彼らの元の親にそれらを再割り当てすることを前提としています。
音を削除するには、 `コマンドとあなたは関係のための適切な削除規則が設定されていることを確認する必要があります。あなたは、明示的な「ManagedObjectContext DeleteObjectのを使用する必要があります。