# Enregistrement vide dans core data



## mcjoe (22 Décembre 2011)

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 :


```
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 :


```
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


----------



## Céroce (23 Décembre 2011)

J'ai comparé à mon propre code, et ça me parait bon.
Utilises-tu NSPersistentDocument pour créer les NSPersistentStore et le NSManagedObjectContext ?

Il te reste la possibilité du pas-à-pas au débogueur et enregistrer au format XML pour voir le contenu du fichier.


----------



## mcjoe (23 Décembre 2011)

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


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


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


```
- (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 ?


----------



## Céroce (23 Décembre 2011)

mcjoe a dit:


> 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).


----------



## Lio70 (23 Décembre 2011)

Céroce a dit:


> soit tu ouvres la BdD avec un éditeur SQLite (jamais fait, mais j'ai vu sur le net qu'on pouvait).


Pour ma part, j'utilise un add-on pour Firefox, qui s'appelle SQLite Manager. Tres pratique.


----------



## mcjoe (2 Janvier 2012)

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 

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

Bonne journée


----------

