1

私のCoreDataデータモデルには、NoteエンティティとTagエンティティがあり、それらには多対多の関係があるため、各Noteは多くのタグを持つことができ、各タグは多くのNoteに属する可能性があります。

タグは、コンマで区切られた文字列として入力されます:cat、dog、pig

次に、文字列を「cat」、「dog」、「pig」に分割します。

タグ「cat」、「dog」、「pig」が付いたメモがあり、「pig」を削除して「bird」を追加した場合、最初は「cat、dog、bird」、次に「cat」という文字列があります。 、'犬'、'鳥'、

今、私は何をすべきですか?このメモのすべてのタグを削除して、すべてのタグを再度追加する必要がありますか?しかし、すべてのタグを削除すると、同じタグを共有する他のノートはそれらのタグを失いますか?

ありがとう!

4

1 に答える 1

3

オブジェクトを削除することと、関係からオブジェクトを削除することを混同しています。

まず、関係の削除ルールを確認します。

ルールを削除

削除ルールが「nullify」の場合、オブジェクトを削除せずにリレーションシップからオブジェクトを削除できることを意味します。これは、この場合に必要なことのように聞こえます。タグを使用する他のすべてのノートに影響を与えることなく、特定のノートとの関係からタグを削除できるようにする必要があります。

新しいタグのセットとの関係を実際に修正することに関して、あなたができることが2つあります。最初の方法は、あなたが述べたように、メモからすべてのタグを削除して、それらを再度追加することです。それは実際にはかなり良い計画です。もちろん、タグを追加するときは、タグごとに、最初に存在するかどうかを確認する必要があります。存在する場合は、既存のタグをリレーションシップに追加します。

擬似コードの場合:

  1. 現在のメモからすべてのタグを削除します。
  2. 追加したいものを保持するために、可変セットを作成します。
  3. リンクされたタグの文字列の新しい配列を取得します
  4. タグ文字列ごとに、次の手順を実行します。
    1. その名前のTagオブジェクトを見つけるための述語を作成します。フェッチ要求を作成して実行します。
    2. 結果を確認します。返されたタグがある場合(つまり、結果の配列に0を超えるオブジェクトが含まれている場合)、それを可変セットに追加します。
    3. 返されたタグがなかった場合(つまり、その名前のタグがない場合)、新しいTagオブジェクトを作成します。それを可変セットに追加します。
  5. Noteのtagsプロパティを新しいタグのセットに設定します。

これを行う別の方法は、関係からタグを一度に1つずつ追加および削除できるようにすることで、を呼び出すことNSMutableSet *mySet = [yourNote mutableSetValueForKey:@"tags"]です。これにより、タグオブジェクトの変更可能なセットが返され、セットに加えた変更はCoreDataによって自動的に認識されます。そのため、オブジェクトを削除すると、そのオブジェクトは関係から外れるか、セットに別のタグを追加して、メモに関連付けられるようになります。

このいずれにおいても、データベースからオブジェクトを削除することはありませんでした。すべてのタグはまだ存在します。どのタグがどのノートに関連しているかを変更しただけです。

于 2012-05-25T09:24:25.083 に答える