2012-02-16 3 views
1

J'ai fait simple base de données Exemple:iOS: Core Data: NSRangeException en exemple simple

NSLog(@"Loading..."); 
NSURL *modelUrl = [[NSBundle mainBundle] URLForResource:@"CoreDataTest" withExtension:@"momd"]; 
NSManagedObjectModel *objectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];  
NSManagedObjectContext *objectContext = [[NSManagedObjectContext alloc] init]; 

NSError *error = nil; 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSURL *storeUrl = [NSURL fileURLWithPath:[documentsDirectory stringByAppendingPathComponent:@"DB.sqlite"]]; 
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:objectModel]; 
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 
NSPersistentStore *migratedStore = [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]; 
if(migratedStore == nil) { 
    NSLog(@"Could not initialize or migrate store: %@", [error localizedDescription]); 
} 

[objectContext setPersistentStoreCoordinator:coordinator]; 

MyQueuedJob *queuedJob = (MyQueuedJob *) [NSEntityDescription insertNewObjectForEntityForName:@"MyQueuedJob" inManagedObjectContext:objectContext]; 
queuedJob.fooBar = @"Test"; 

[objectContext save:&error]; 
sleep(2); 

NSFetchRequest *request = [NSFetchRequest alloc]; 
NSEntityDescription *entDesc = [NSEntityDescription entityForName:@"MyQueuedJob" inManagedObjectContext:objectContext]; 
[request setEntity:entDesc]; 
NSSortDescriptor *sortDesc = [[NSSortDescriptor alloc] initWithKey:@"fooBar" ascending:YES]; 
[request setSortDescriptors:[[NSArray alloc] initWithObjects:sortDesc, nil]]; 
NSLog(@"fetching jobs..."); 
NSArray *fetchResults = [objectContext executeFetchRequest:request error:nil]; 
NSLog(@"jobs fetched!"); 
NSLog(@"%@", [fetchResults componentsJoinedByString:@", "]); 

Code de MyQueuedJob.h (généré par Xcode):

@interface MyQueuedJob : NSManagedObject 

@property (nonatomic, retain) NSString * fooBar; 

@end 

Cet exemple fonctionne parfaitement bien dans le simulateur. Mais quand je le lance sur mon vrai iPhone 4, il se bloque avec le message suivant:

2012-02-16 11:06:44.819 CoreDataTest[345:707] Loading... 
2012-02-16 11:06:46.937 CoreDataTest[345:707] fetching jobs... 
2012-02-16 11:06:46.950 CoreDataTest[345:707] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array' 

sur cette ligne:

NSArray *fetchResults = [objectContext executeFetchRequest:request error:nil]; 

Qu'est-ce que je fais mal?

+0

Quel tableau est interrogé pour produire l'exception? Activez les points d'arrêt d'exception d'objectif-c dans Xcode, puis déterminez la ligne de code à l'origine de l'exception. – bneely

Répondre

1
NSFetchRequest *request = [NSFetchRequest alloc]; 

Vous devez init init this. Changez-le en [[NSFetchRequest alloc] init];

+0

Merci! Savez-vous, pourquoi cela a fonctionné dans le simulateur? – pencil

+0

Je ne sais pas pourquoi ce serait. Idéalement, il échouerait de la même manière dans les deux endroits. Le simulateur iOS n'est, bien sûr, pas une simulation parfaite d'un appareil iOS réel. Toutes les parties du logiciel ne sont pas exactement les mêmes. Je ne sais pas si le runtime d'objectif-c correspond au simulateur iOS et à un vrai appareil iOS. Certains aspects du matériel iOS sont entièrement falsifiés dans le simulateur (par exemple, CoreLocation, la rotation des appareils et le tremblement de l'appareil). – bneely