2

Core Data で管理対象オブジェクトを作成するには:

NSManagedObject *aManagedObject = [NSEntityDescription
insertNewObjectForEntityForName:@"Employee"
inManagedObjectContext:aContext];

管理オブジェクトを削除するには、その管理オブジェクト コンテキストにメッセージを送信します。

[aContext deleteObject:aManagedObject];

そのメソッドはメッセージを aManagedObject に送信します

- (void)prepareForDeletion

これが私の問題です。このデータを外部データベースと同期しています。「削除済み」という名前の属性があります。オブジェクトが最初に「削除」されたときに、「削除済み」属性を YES に設定し、後で削除された外部データベースに同期したいと考えています。将来のある日、すべての「削除された」==YES エンティティは期限切れになり、実際に削除されます。

prepareForDeletion では、次のことを確認するためにテストしたいと思います。

  • dateSynced >= dateModified
  • dateSynced <= 有効期限
  • 「削除」==はい

オブジェクトを本当に削除するか、そうでなければ:

  • dateModified = 現在
  • 「削除」=はい
  • 削除しないようにする

この時点で削除しないようにする方法はありますか?

または、prepareForDeletion を使用して deleteObject をオーバーライドし、obsoleteObject などの新しいメソッドを作成して "deleted" = YES および dateModified=Now を設定し、後で削除するためにのみ deleteObject を使用するべきではありませんか?

4

3 に答える 3

1

私はごく最近、そのようなメカニズムを実装しました。

削除済みとしてマークされたエンティティの削除を遅らせることはできません。コンテキストが次に保存されるときに削除されます。物事を同期させるには、何か他のものに頼らなければなりません。

これが私の解決策です。イベントの永続的なログを作成しました。それらのいくつかは削除イベントです。エンティティが削除済みとしてマークされたら、対応するログ エントリを作成します (実際には別のコンテキストで、ログ エントリが最新であり、実際の削除が実行される前に保存されるように、オブジェクトが削除されるコンテキストの前に保存されます)。ログは後で処理され、削除コマンドがサーバーに発行されます。ログは保存されているが、クラッシュのために削除されたエンティティが削除されていない場合、次にアプリケーションが起動されたときにログが処理され、エンティティがローカルおよびリモートで同時に削除され、すべて問題ありません。

複雑に聞こえますが、実際にはそうではありません。

于 2012-06-11T12:10:43.990 に答える
0

私は、あなたはこのようにすることはできないと思います。私はこれをそのように行いました-オブジェクトの削除時にオブジェクトIDを保存し(私の場合はGUIDがファイルとして保存されます)、同期時に削除をサーバーにプッシュします。

于 2012-06-10T21:02:58.070 に答える