(答えが見つかりました。以下を参照してください。)
次のコードでは、いくつかの関係をリンクして、約 350,000 レコードを更新しています。しかし、最終的に sqlite データベースを調べたところ、関係の一部しか保存されていませんでした。残りはまだゼロです。
-アップデート-
問題のコードを説明する前に、dictionaryOfSynsetDictionaries
プリフェッチされたsynset
オブジェクトが含まれていることを説明する必要があります。これは、キーが「n」、「v」、「a」、および「r」(4 つの品詞または )である 4 つの辞書を含む辞書として編成されていますpos
。各内部辞書にはsynset
、NSManagedObject からサブクラス化されたオブジェクトへの参照が含まれています。
各内部辞書は、 と呼ばれるものによってキー付けされsynsetOffset
ます。
SYNSET_POINTER
以下のコードは、ストアからすべてのオブジェクトをフェッチし、それらを配列に入れます。各SYNSET_POINER
オブジェクトは、および( ) プロパティsynset
によって参照されます。また、オブジェクトをby matchingおよび対応するin にリンクする関係も含まれています。synsetOffset
partOfSpeech
pos
SYNSET_POINTER
synset
synsetOffset
pos
synset
dictionaryOfSynsetDictionaries
オブジェクトをプリフェッチsynset
してディクショナリに整理した後、次のコードはすべてのSYNSET_POINTER
オブジェクトを配列にフェッチし、配列を反復処理して、synset ポインターをそれらの synset オブジェクトに対応する関係を介して直接リンクします。
SYNSET
(上の図は、とオブジェクトの間の 2 つの関係を示していSYNSET_POINTER
ます。これは元のデータセット編成に基づいています。これらは 2 つの異なる目的を果たします。この質問では、1 対 1 の関係について言及しています。)
~更新終了~
更新を行うコードは次のとおりです。
[request setEntity:[NSEntityDescription entityForName:@"SYNSET_POINTER" inManagedObjectContext:[ManagedObjectContext moc]]];
predicate = nil;
[request setPredicate:predicate];
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"synsetOffset" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
NSArray *synsetPointersArray = [[ManagedObjectContext moc] executeFetchRequest:request error:&error];
int i = 0;
int j = 0;
for(SYNSET_POINTER *pointer in synsetPointersArray) {
NSString *pos = pointer.partOfSpeech;
NSString *offset = [pointer.synsetOffset stringValue];
pointer.synsetPointer = [[dictionaryOfSynsetDictionaries objectForKey:pos] objectForKey:offset];
error = nil;
if (![[ManagedObjectContext moc] save:&error]) {
NSLog(@"error with save\n%@\n%@",error.localizedFailureReason, error.localizedDescription);
NSLog(@"pause and quit");
}
NSLog(@"pos %@, offset %@, pointer %@", pos, offset, pointer);
if (j==100) {
NSLog(@"%@ %d", pos, i);
j=0;
}
i++;
j++;
}
ここでは、synsetPointer
NSManagedObject のサブクラスである SYNSET_POINTER クラスのポインターのプロパティを更新しています。synsetPointer
このデバッガ出力のように、ループの反復ごとに、リレーションシップが適切なオブジェクトを指していることがわかります。
2012-11-26 22:03:08.753 [26156:fb03] pos v, offset 5815, pointer <SYNSET_POINTER: 0x404e84f0> (entity: SYNSET_POINTER; id: 0x404d00d0 <x-coredata://9136BC94-4D77-4DB6-B03F-4F3AA35E2E49/SYNSET_POINTER/p282133> ; data: {
partOfSpeech = v;
pointerSymbol = "~";
reverseRelatedSynset = "0x244cd880 <x-coredata://9136BC94-4D77-4DB6-B03F-4F3AA35E2E49/SYNSET/p85476>";
sourceTarget = 0000;
synsetOffset = 5815;
synsetPointer = "0x244cdda0 <x-coredata://9136BC94-4D77-4DB6-B03F-4F3AA35E2E49/SYNSET/p83738>";
})
2012-11-26 22:03:08.822 [26156:fb03] pos v, offset 5815, pointer <SYNSET_POINTER: 0x404e8530> (entity: SYNSET_POINTER; id: 0x404d00e0 <x-coredata://9136BC94-4D77-4DB6-B03F-4F3AA35E2E49/SYNSET_POINTER/p285862> ; data: {
partOfSpeech = v;
pointerSymbol = "@";
reverseRelatedSynset = "0x244cd870 <x-coredata://9136BC94-4D77-4DB6-B03F-4F3AA35E2E49/SYNSET/p86470>";
sourceTarget = 0000;
synsetOffset = 5815;
synsetPointer = "0x244cdda0 <x-coredata://9136BC94-4D77-4DB6-B03F-4F3AA35E2E49/SYNSET/p83738>";
})
は値synsetPointersArray
でソートされsynsetOffset
ます。Firefox の sqlite ビューアーでテーブルをソートできますが、ほとんどの値が nil のままであることがわかります。上記のデバッグ出力は、それらがすべて割り当てられていることを示しています。何らかの理由で、それらは保存されていません。
一部の更新を妨げるこのコードの問題を誰かが見ることができますか?