(答案找到见下文。)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查看器中对表格进行排序,我发现大部分值都保持为零。上面的调试输出显示它们全部被分配。由于某种原因,他们没有被保存。
任何人都可以看到这个代码会阻止一些更新的问题吗?
这真的帮助我!谢谢。要注意那些一对一的。 –