1

私はコアデータに2つのテーブル、たとえばテーブルTAとテーブルTBを持っています。TAはTBと1対多の関係にあります。TA には 1 つのレコード A1 があり、for ループで A1 にマッピングする TB に複数のレコード (B1、B2、..) が必要です。最初の反復では、db を照会して A1 を取得し、addTBObject:B1 を呼び出して、コンテキストを保存しませんでした。次の繰り返しで、再度クエリを実行して A1 を取得しますが、nil が返されます。(とても奇妙...)

最初の反復でコンテキストを保存すると、次の反復で再び A1 を取得しても問題ありません。しかし、これはより良い方法だとは思いません。これにより、1 つの for ループで多くの保存アクションが実行されることになります。

誰でもこれについて助けることができますか?それに感謝します!

コードの抜粋:

NSString* objBId = @"xxx";
for (int i=0; i< [dataArray count]; i++) {
    ObjA obj = [dataArray objectAtIndex:i];
    NSManagedObject* moObjA = [self getManagedObjAById:obj.objId inContext:context];
    if(moObjA)
    {
        NSManagedObject* moObjB = [self getManagedObjBById:objBId inContext:context];
        if (moObjB != nil)
        {
            [moObjB addAObject:moObjA];
            [self saveDB:context]; //if don't save here, moObjB will be nil in the next iteration...
        }
    }
}
4

1 に答える 1

0

この問題の手がかりが見つかったようです。getManagedObjBById の実装では、NSFetchRequest が毎回開始されます。各反復でコミットがない場合、フェッチ要求は次の反復で nil を返します。

[NSFetchRequest fetchRequestWithEntityName:@"TableB"] を使用するようにコードを変更したら、すべての設定が完了しました。for ループは、それ以上保存せずに、各反復で常に管理対象オブジェクト B を取得できます。

さらに見てみると、これは、特定のエンティティの NSFetchRequest をコミット前に 1 回しか初期化できない (1 つのトランザクション) ということですか??

オリジンコード:

NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"xxx" inManagedObjectContext:context]];

今:

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"xxx"];
于 2013-04-16T06:08:45.510 に答える