Enregistrement vide dans core data

mcjoe

Membre confirmé
22 Décembre 2011
20
2
Grenoble
Bonjour

J'ai un problème dans Core Data ue je cherche à résoudre.

J'ai créé une table news, puis un objet NSManagedObject correspondant.

Ensuite, je cherche à enregistrer un nouvel objet dans la base, mais là arrivé le problème.
Une ligne se crée bien mais elle est vide. Donc je ne sais pas si le problème vient de l'enregistrement ou de la récupération.

Voici le code pour l'ajout :

Bloc de code:
NewsAppDelegate* appDelegate = (NewsAppDelegate*)[[UIApplication sharedApplication]delegate];
    News* news = (News*)[NSEntityDescription insertNewObjectForEntityForName:@"News" inManagedObjectContext:appDelegate.managedObjectContext];
    
    news.idNews = [NSNumber numberWithInt:3];
    news.title = @"Test 1";
    news.content = @"Content of Test of course";
    news.date = [NSDate date];
    
    NSError* error;
    
    if (![appDelegate.managedObjectContext save:&error]) {
        UIAlertView* alerte = [[UIAlertView alloc] initWithTitle:@"Erreur de sauvegarde" message:[NSString stringWithFormat:@"%i in %@ : %@", error.code, error.domain, error.userInfo] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alerte show];
        [alerte release];
    }
    
    [self.list addObject:news];
    
    [self.tableView reloadData];

Je précise que l'ajout dans list fonctionne, je vois correctement dans la liste.

Maintenant la récupération du contenu :

Bloc de code:
NewsAppDelegate* appDelegate = (NewsAppDelegate*)[[UIApplication sharedApplication]delegate];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"News" inManagedObjectContext:appDelegate.managedObjectContext];
    
    NSFetchRequest* request = [[NSFetchRequest alloc]init];
    [request setEntity:entity];
    
    NSSortDescriptor* sort = [[NSSortDescriptor alloc]initWithKey:@"date" ascending:NO];
    NSArray* sortDescriptors = [NSArray arrayWithObject:sort];
    [request setSortDescriptors:sortDescriptors];
    [sort release];
    
    NSError* error;
    
    NSMutableArray* results = [[appDelegate.managedObjectContext executeFetchRequest:request error:&error]mutableCopy];
    
    if (!results) {
        UIAlertView* alerte = [[UIAlertView alloc] initWithTitle:@"Erreur de sauvegarde" message:[NSString stringWithFormat:@"%i in %@ : %@", error.code, error.domain, error.userInfo] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alerte show];
        [alerte release];
    }
    
    [self setList:results];
    [results release];
    [request release];

Mon objet managedObjectContext est dans mon appDelegate (créé automatiquement par xcode lorsque je demande un projet avec Core Data.
Je précise aussi que j'ai déjà supprimé mon application du simulateur et recompilé mais ça fonctionne pas mieux.

Voilà je pense que c'est tout, juste que mes 2 fonctions se situent dans un UITableViewController mais voilà

Geoffrey
 
Le NSPersistantStoreCoordinator et le NSManagedObjectContext n'utilisent pas de NSPersistantDocument.
Voilà le code donné par xcode lors de la création :

Bloc de code:
- (NSManagedObjectModel *)managedObjectModel
{
    if (__managedObjectModel != nil)
    {
        return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"News2" withExtension:@"momd"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return __managedObjectModel;
}

Bloc de code:
- (NSManagedObjectModel *)managedObjectModel
{
    if (__managedObjectModel != nil)
    {
        return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"News2" withExtension:@"momd"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return __managedObjectModel;
}

Bloc de code:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }
    
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"News2.sqlite"];
    
    NSError *error = nil;
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    
    
    return __persistentStoreCoordinator;
}

Sinon est-ce qu'il y a un moyen pour voir le contenu de ma base dans core data ?
 
Sinon est-ce qu'il y a un moyen pour voir le contenu de ma base dans core data ?

Oui, soit tu changes le type de Persistent Store pour le passer en XML (ça sert justement à déboguer), ou soit tu ouvres la BdD avec un éditeur SQLite (jamais fait, mais j'ai vu sur le net qu'on pouvait).
 
Bon après un bon petit temps de recherche, j'ai finalement réussi. Je ne sais pas pourquoi ça ne fonctionnait pas mais maintenant oui :p

merci en tout cas céroce et lio pour m'avoir dit comment voir le contenu de mes tables.

Bonne journée