0

そこに表示されるモデルを作成しました: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 save:]次に、メソッドとQUITAPPを使用してmanagedObjectContextを保存します。

アプリを再起動して実行するとき

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>
);

以前の音が見えます!

ここで、SoundsRelationを5つの他のサウンドを含む他のNSSetでオーバーライドすると、次のようになります。[category setValue:otherSetWithFiveSounds forKeyPath:@ "SoundsRelation"];

そして行う:NSLog(@ "description:\ n%@"、category);

わかります:Name = "Cat1"; SoundsRelation =(0x174e90、0x174ef0、0x174ab0、0x1743b0、0x1744b0);

保存して終了して再起動すると、カテゴリをNSLロギングした後、次のように表示されます。

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>
);

古い音と新しい音が表示されます。なんで?古い関係を新しい関係に完全にオーバーライドするにはどうすればよいですか?

4

1 に答える 1

1

この行:

[category setValue:nil forKeyPath:@"SoundsRelation"];

ManagedObjectContext からサウンドを削除しません。これは、カテゴリ オブジェクトとサウンド オブジェクトの間のリンクを壊すだけです。CoreData は、永続ストアに孤立したオブジェクトを作成するため、これを好みません。再起動すると、CoreData は、エラーによってオブジェクトが孤立したと見なし、それらを元の親に再割り当てします。

サウンドを削除するには、明示的な「ManagedObjectContext deleteObject:」コマンドを使用する必要があります。また、関係に対して適切な削除ルールが設定されていることを確認する必要があります。

于 2009-11-08T17:37:50.873 に答える