我希望有人可以幫助我調試令人難以置信的Core Data崩潰。我最初將數據加載到兩個實體(代表「發言人」和「標題」),然後爲「會話」加載第三個實體,並嘗試將關係設置爲「發言人」和「標題」。 (從會話到演講者和標題是一對一的,從演講者/標題到會話是一對多的)。我使用整數鍵來設置每個關係。難以調試iPhone核心數據錯誤
由於給定的發言人和標題可以指向多個會話,因此我編寫了一個搜索適當的託管對象並返回該對象的函數。然後我爲這種關係做了設定。
這對於演講者關係很好,但對於第二個標題一致而且可怕地崩潰。我用不同的方式重寫了這些代碼幾次,我總是會遇到同樣的問題。無論第二個標題是什麼,問題都存在。所以我必須做一些根本性錯誤的事情,但繼續閱讀更多iPhone 3開發中的核心數據章節,沒有什麼會跳出來。我希望有人可能會看到我錯過的東西(並且一直持續幾天)。 (最後一個注意:無論我將managedObjectContext保存在for循環還是外部,都會發生崩潰,並始終在第二個會話中)。我無盡的感謝和初生的孩子,無論誰能幫助我。
這裏的培訓相關的代碼保存會話實體:
for (NSDictionary *session in self.sessions){
NSManagedObject *newSession = [NSEntityDescription insertNewObjectForEntityForName:[sessionEntity name] inManagedObjectContext:self.managedObjectContext];
[newSession setValue:[session valueForKey:@"ID"] forKey:@"id"];
[newSession setValue:[session valueForKey:@"notes"] forKey:@"notes"];
[newSession setValue:[session valueForKey:@"length"] forKey:@"length"];
//get the speaker value;
[newSession setValue:[self setupSpeaker:[session valueForKey:@"speaker"]] forKey:@"speaker"];
NSLog(@"now doing title");
//now get the title value;
[newSession setValue:[self setupTitle:[session valueForKey:@"title"]] forKey:@"title"];
NSLog(@"I got back this title:%@", [newSession valueForKey:@"title"]);
}
if (![self.managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
下面是找到合適的揚聲器和標題實體的關係(我知道這是相當冗餘)代碼
-(NSManagedObject *) setupSpeaker:(NSNumber *)id {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Speaker" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id==%@",id];
[fetchRequest setPredicate:predicate];
NSError *error;
NSArray *items=[self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
if ([items count]>=1){
return [items objectAtIndex:0];
}else{
return 0;
}
}
-(NSManagedObject *) setupTitle:(NSNumber *)id {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Title" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSLog(@"now looking for: %@", id);
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id==%@",id];
[fetchRequest setPredicate:predicate];
NSError *error;
NSArray *items=[self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
if ([items count]>=1){
NSLog(@"found %@", id);
return [items objectAtIndex:0];
}else{
return 0;
}
}
最後,這裏是日誌崩潰時說的:
2010-02-20 16:48:17.134 iconf[1438:207] now looking for: 1
2010-02-20 16:48:17.136 iconf[1438:207] found 1
2010-02-20 16:48:17.156 iconf[1438:207] I got back this title:<NSManagedObject: 0x3b11a10> (entity: Title; id: 0x3d4a3c0 <x-coredata://B76F62BD-AC82-4335-9013-7529C2471F9C/Title/p6> ; data: {
id = 1;
session = (
0x3d51640 <x-coredata:///Session/t2765697F-14C9-4282-A067-10A2413732B834>
);
title = "Bill Gates Speaks";
})
2010-02-20 16:48:17.158 iconf[1438:207] now doing title
2010-02-20 16:48:17.158 iconf[1438:207] now looking for: 2
2010-02-20 16:48:17.159 iconf[1438:207] found 2
2010-02-20 16:48:17.161 iconf[1438:207] I got back this title:<NSManagedObject: 0x3b16fd0> (entity: Title; id: 0x3d4d7a0 <x-coredata://B76F62BD-AC82-4335-9013-7529C2471F9C/Title/p12> ; data: {
id = 2;
session = (
0x3b1b320 <x-coredata:///Session/t2765697F-14C9-4282-A067-10A2413732B835>
);
title = "Lecture on Frogs";
})
2010-02-20 16:48:17.161 iconf[1438:207] *** -[NSManagedObject compare:]: unrecognized selector sent to instance 0x3b11a10
2010-02-20 16:48:17.162 iconf[1438:207] Serious application error. Exception was caught during Core Data change processing: *** -[NSManagedObject compare:]: unrecognized selector sent to instance 0x3b11a10 with userInfo (null)
2010-02-20 16:48:17.163 iconf[1438:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSManagedObject compare:]: unrecognized selector sent to instance 0x3b11a10'
2010-02-20 16:48:17.163 iconf[1438:207] Stack: (
如果你可以設置調試器並找出它到底崩潰的線路,它將會有很大的幫助。如果您發佈數據模型的圖表,這樣也可以幫助我們清楚地看到這些關係。 – TechZen 2010-02-21 01:45:10