(答案找到見下文。)NSManagedObjects不被保存 - 逆關係謹防
在下面的代碼,我通過將一些關係的更新約350,000條記錄。然而,最後,我檢查了sqlite數據庫,並且只保留了一小部分關係。其餘的仍然是零。
-update-
在描述問題的代碼,我要解釋的是,dictionaryOfSynsetDictionaries
包含預取synset
對象。它被組織成包含四個詞典的字典,其中鍵是'n','v','a'和'r'(對於四個詞類,或pos
)。每個內部字典都包含對從NSManagedObject分類的synset
對象的引用。
每個內部詞典都被稱爲synsetOffset
。
以下代碼從存儲中獲取所有SYNSET_POINTER
對象,並將它們放入數組中。每個SYNSET_POINER
對象是指synset
的synsetOffset
和partOfSpeech
(pos
)屬性。它還包含在dictionaryOfSynsetDictionaries
匹配synsetOffset
和pos
到相應的synset
所以現在,在已預取和組織synset
對象到字典鏈接SYNSET_POINTER
對象到synset
的關係,下面的代碼獲取所有的SYNSET_POINTER
對象添加到數組中,迭代數組,將synset指針直接通過對應關係鏈接到它們的synset對象。
(上圖爲該SYNSET
和SYNSET_POINTER
對象之間的兩個關係,這是基於原始數據集的組織。他們有兩個不同的目的。對於這個問題,我指的是一對。酮關係)
末端最新情況:
這裏是做更新的代碼:
[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
作爲NSNSagedObject類的子類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查看器中對錶格進行排序,我發現大部分值都保持爲零。上面的調試輸出顯示它們全部被分配。由於某種原因,他們沒有被保存。
任何人都可以看到這個代碼會阻止一些更新的問題嗎?
這真的幫助我!謝謝。要注意那些一對一的。 –