1

フィード内のディクショナリ オブジェクトとコア データ内の並べ替えられたエンティティとの間の次の相関関係を考慮してください。

Feed  CoreData
----  --------
A     A
B     B
C     C
D     D

フィードを列挙しているとき、エンティティで A の[stringForKey:@"name"]isEqualToかどうかを確認A.nameします。一致する場合は、エンティティを更新します。そうでない場合は、新しいエンティティを CoreData に挿入します。

これは、更新と挿入には問題なく機能しますが、削除には機能しません。オブジェクト C がフィードから削除されたとします。

Feed  CoreData
----  --------
A     A
B     B
D     C
      D

フィードの "D" に到達すると、CoreData のオブジェクト "C" が一致しないことがわかり、新しいオブジェクト D が作成されます。したがって、2 つの問題があります。2 つの "D" オブジェクトがあり、オブジェクト " C" は CoreData から削除されません。

だから私はこれで終わりたいと思っています:

Feed  CoreData
----  --------
A     A
B     B
D     D

私が現在得ているのはこれです:

Feed  CoreData
----  --------
A     A
B     B
D     C
      D
      D

これは一般的な問題に違いないので、コア データからエンティティを削除するタイミングを決定するためのベスト プラクティスは何なのか疑問に思っています。

4

2 に答える 2

1

ご覧のとおり、既に Feed オブジェクトの配列と CoreData オブジェクトの配列があり、どちらも同じ属性「名前」で昇順で並べ替えられています。

配列への2 つの独立したポインターを使用して、両方の配列を 1 回ループするだけで、Feed オブジェクトから CoreData オブジェクトを更新/挿入/削除できます。

擬似コードは次のようになります。

i1 = 0; // pointer into Feed array
i2 = 0; // pointer into CD (CoreData objects) array
while (i1 < Feed.count && i2 < CD.count) {
    if (Feed[i1].name < CD[i2].name) {
        // Feed[i1] is not in CD array
        "Insert Feed[i1] as new Core Data object"
        i1++;
    } else if (Feed[i1].name > CD[i2].name) {
        // CD[i2].name is not in Feed array
        "Delete CD[i2] from Core Data"
        i2++;
    } else {
        "Update CD[i2] from Feed[i1]"
        i1++, i2++;
    }
}

// Add remaining objects from Feed array:
while (i1 < Feed.count) {
        "Insert Feed[i1] as new Core Data object"
        i1++;
}

// Remove remaining Core Data objects
while (i2 < CD.count) {
        "Delete CD[i2] from Core Data"
        i2++;
}

あなたの例では:

    フィード CoreData
    ---- --------
i1->A i2->同名、CoreData オブジェクトを更新、i1++、i2++
    BB
    DC
              D
    フィード CoreData
    ---- --------
    AA
i1->B i2->B 同名、CoreData オブジェクトを更新、i1++、i2++
    DC
              D
    フィード CoreData
    ---- --------
    AA
    BB
i1->D i2->C "D" > "C"、CoreData オブジェクトを削除、i2++
              D
    フィード CoreData
    ---- --------
    AA
    BB
i1->DC
          i2->D同名、CoreDataオブジェクト更新、i1++、i2++
于 2013-06-17T21:39:56.817 に答える