13

コア データ ドリブン アプリの一般的なシナリオは、バッキング ストアから一意のオブジェクトを取得することです。特定の一意のプロパティを持つオブジェクトが存在する場合は、そのオブジェクトを返します。新しく作成されたオブジェクトを返さない場合は、それを返します。同じことを何度も書いていることに気がついたので、便利なメソッドでラップしました。しかし、これはとても些細なことのように思えます。これを達成するためのより簡単ですぐに使える方法はありますか?

乾杯、
EP

+(id)uniqueEntityfForName:(NSString *)name 
                withValue:(id)value 
                   forKey:(NSString *)key
   inManagedObjectContext:(NSManagedObjectContext *)context {

    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];    
    request.entity = [NSEntityDescription entityForName:name inManagedObjectContext:context];
    request.predicate = [NSPredicate predicateWithFormat:[key stringByAppendingString:@" == %@"], value];
    NSArray *result = [context executeFetchRequest:request error:nil];

    id entity = [result lastObject];
    if (entity == nil) {
        entity = [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:context];
        [entity setValue:value forKey:key];
    } else {
        entity = [result lastObject];
    }

    return entity;
}

私はこの方法を次のように使用します。

SomeEntity *entity = [CDUtils uniqueEntityfForName:@"SomeEntity" withValue:@"foo" forKey:@"bar" inManagedObjectContext:context];
4

2 に答える 2

3

かなり標準的。私のコア データ エンティティには、 のようなメソッドがたくさんあります[aStudent enrollmentForId:(long long)idValue createIfMissing:YES]

また、 Core Data の負担を大幅に軽減するmogeneratorもプラグインしたいと思います。特に、データ モデルで定義されたすべてのフェッチ要求に対してファクトリ メソッドを生成します。したがって、モデルでフェッチ述語を作成すると、たとえば次のようになります。

物: thingyId == $forThingyId

一致するクラス メソッドを生成します。

+(NSArray *)fetchThingies:(NSManagedObjectContext *)moc forThingyId:(id)thingyId

...これは、あなたがそこに書いたことの前半を行います。のようなラッパー

-(Thingy*)thingyForIdValue:(long long)thingyId

その後、管理対象オブジェクト コンテキストを保持するクラス (たとえば、「親」エンティティ、アプリ デリゲートなど) に簡単に記述できます。

于 2011-02-17T21:09:49.033 に答える
2

より柔軟な解決策はBlocks、呼び出し元が 2 つのリストを比較するときに 3 つの状況を処理できるようにすることです。

  1. マッチングセット
  2. ホスト不一致セット
  3. ローカルの不一致セット

したがって、同期方式で挿入する場合やデータ ストアに追加する場合に、同様の関数を作成する必要はありません。

typedef void (^objectOperationBlock)(NSManagedObjectContext *context,
                                 NSDictionary *hostObjectData,
                                 NSManagedObject *localManagedObject);

- (void) insertUniquely:(NSArray *)rawDataArray 
                 entity:(NSString *)entity 
           matchedBlock:(objectOperationBlock)matchedOperation
     hostUnmatchedBlock:(objectOperationBlock)hostUnmatchedOperation
    localUnmatchedBlock:(objectOperationBlock)localUnmatchedOperation
                  error:(NSError **)outError;

完全な実装はここにあります: http://emplementation.blogspot.com/2011/12/importing-data-into-core-data-while.html

于 2011-12-27T06:07:26.257 に答える