5

いくつかの背景:

大量のデータをローカルDBに保存しようとしていますが、できるだけ効率的に保存したいと考えています。

シナリオ:

アドレスが次のような連絡先に関連付けられているなど、相互に関連している多くのエンティティがあります。

アドレス<<->連絡先

関係を管理するために、NSManagedObjectの各サブクラスにメソッドを記述しました。以下にいくつかのコードスニペットを示します。

// class Contact
- (void)manageRelationships
{
    @autoreleasepool {
        LocalDBManager *localDBManager = [[LocalDBManager alloc] init];

        // managing relationships

        // map associated addresses

        NSPredicate *addressIdPredicate = [NSPredicate predicateWithFormat:@"%K == %@",ADDRESSID,self.addressid];

        // below method returns an object as fault by firing a fetch request against context
         NSSet *retrievedAddresses = [localDBManager retrieveManagedObjectsForEntity:ADDR_ENTITY withPredicate:addressIdPredicate asFault:YES withPropertyValues:NO error:nil];
        self.addresses = retrievedAddresses;


        // managing few more relationships         
    }

}

考慮すべきポイント:

オブジェクトには複数の関係が存在する可能性があるため、関係をマッピングするときにメモリ消費量が増えることはわかっています。

質問:

関係がマッピングされたら、加えられた変更を失うことなく、オブジェクトを障害に戻したいと思います。

アップルのドキュメントといくつかのグーグルから、refreshObject:mergeChanges:メソッドを使用できることがわかりました。したがって、manageRelationshipsメソッドのコードブロックの最後に以下の行を追加することを計画しています。

[[self managedObjectContext] refreshObject:self mergeChanges:YES];

私は少し混乱していて、それを知りたいです-

オブジェクトに加えられた変更が永続ストアに保存され、オブジェクトが障害に変わることを意味しますか?はいの場合、NSManagedObjectContextのsaveメソッドと同等と見なすことができますか

提案してください。

4

1 に答える 1

11

まず第一に、あなたは自分で関係を管理する必要はありません。CoreDataにそれを処理させます。

障害のデータにアクセスすると、Core Dataは障害を自動的に解決(起動)します。関連オブジェクトのこの遅延読み込みは、メモリの使用にはるかに優れており、めったに使用されない(または非常に大きい)オブジェクトに関連するオブジェクトのフェッチにははるかに高速です。 CoreDataのパフォーマンス

これを行うには、連絡先アドレス間の1対多の関係を単純にインスタンス化します。

refreshObject:mergeChangesに関して:あなたは間違っています。これは、save:メソッドと同等ではありません。マージ変更をYESに設定した場合、それは次のことを意味するだけです。

フラグがYESの場合、オブジェクトのプロパティ値はストアの値または最後にキャッシュされた状態から再ロードされ、(ローカルコンテキストで)行われた変更はそれらの(現在新しく更新された)値に再適用されます。 Cocoa touch Doc

したがって、管理対象オブジェクトAにいくつかの変更を加えてから、[context refreshObject:A mergeChanges:YES]を行った場合、オブジェクトAは未保存の状態のままになります。

于 2013-02-14T08:47:12.827 に答える