# NSManagedObject et Core Data



## sublimema (24 Septembre 2010)

yep all

toujours dans ma soif de connaissance d'objective-c, j'aurai (encore) deux petites questions à poser...

j'ai besoin de crée une catégorie qui regroupe toutes les autres dans un tableView...

donc dans un premier temps, j'ai besoin de crée une catégorie NSManagedObject dans mon NSEntityDescription tout sa a l'interieur de ma méthode ViewDidLoad (est-ce vraiment la???)
donc il faudrait que j'arrive a faire un truc du genre le code suivant pour ne pas recréé une autre catégorie "toutes":


```
NSManagedObjectContext *context =[fetchedResultsController managedObjectContext];
NSEntityDescription *entity= [[fetchedResultsController fetchRequest] entity];

if (![entity valueForKey:@"category"]==@"toutes"]{
       NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
       [newManagedObject setValue:@"Toutes" forKey:@"categoryName"];
}
```

puis en deuxième temps, j'ai besoin de rajouter tous les objets des catégories dans la catégorie "toutes" donc il faudrait que je fasse une copy de mon newManagedObject de ma categorie "categoryX"  pour la mettre aussi dans ma categorie "toute". et la c'est le drame... je flanche total... je me dit que je pourrais le faire sans faire de copy, mais cela surchargerai le code... bref need help!


----------



## ntx (24 Septembre 2010)

Pour un copie "light" d'un objet, un retain suffit.


----------



## sublimema (25 Septembre 2010)

merci!

mais pour mon premier problème qui est toujours d'actualité, si j'essaie avec 


```
if (![[entity valueForKey:@"categoryName"] isEqual:@"Toutes"]){
		NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
		[newManagedObject setValue:@"Toutes" forKey:@"categoryName"];
		
	}
```

sa me sor une erreur a la ligne "NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];" ce qui veut dire que apparement, il prend ma condition en compte  ... mais ne l'execute pas  ...


----------



## ntx (25 Septembre 2010)

Quelle erreur ?


----------



## sublimema (25 Septembre 2010)

cette erreur:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name '(null)''


----------



## ntx (25 Septembre 2010)

Est-ce que tu as vérifié que entity n'était pas nulle ? Que sont nom n'était pas nul ? Ta façon de récupérer entity n'est peut être pas bonne.


----------



## sublimema (28 Septembre 2010)

merci pour ta réponse

en effet si je remplace [entity name] par @"Category" , le code marche mais il me fout le bordel dans mes sous object: il me mets tout les sous object dans toute les catégory...:hein:

i'm lost! 

et c'est pas le tuto en anglais sur le core data qui m'aide beaucoup...


----------



## BooBoo (28 Septembre 2010)

Comme dit dans un autre thread, il est conseillé de ne pas commencer a apprendre ObjC/Cocoa avec Core Data...

mais bon...

explique un peu mieux ton modele et ce que tu veux faire dans ta table view (sections ?)


----------



## sublimema (28 Septembre 2010)

j'avoue que je me lance un peu "a la pute" dans le dev apple... et c'est pour sa que j'ai besoin de bien connaître le fonctionnement de core data...

alors voila l'exercice:
je crée une application qui permettra de se souvenir quel objet a été prêté a tel personne.

j'aurai donc 2 entités : une Category et une autre LendObject.

jusque la sa va, bien que je n'ai pas tellement compris le fonctionnement de la pile core data (NSManagedObjectContext->NSPersistentStoreCoordinator->NSManagedObjectModel)

la ou je galere vraiment, c'est pour crée une catégorie qui regrouperait tous les objets de toutes les autres catégories...

je ne sais pas vraiment comment crée cette category: lorsque que l'on crée un projet Navigation-based application sous xcode, il nous propose le code suivant pour ajouter une nouvelle instance d'entité:

```
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
    NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
```

dois-je utilisé la même méthode pour crée cette catégorie?


----------



## Nyx0uf (28 Septembre 2010)

A quoi ça sert de coder bêtement si t'as déjà pas compris les rôles de NSManagedObjectContext, NSManagedObjectModel et NSPersistentStoreCoordinator ?

http://www.amazon.com/Core-Data-Apples-API-Persisting/dp/1934356328


----------



## Rez2a (28 Septembre 2010)

Je déconseille aussi beaucoup de commencer par Core Data, mais puisque tu y tiens, dans ton projet, tu devrais avoir un fichier .xcdatamodel dans lequel il faut créer ton modèle de données.
Si tu as déjà fait des MCD pour bases de données relationnelles, en schématisant très gros, c'est le même principe : tu crées tes "tables" (en fait ce sont des classes), qui comprennent des attributs (variables d'instance) et tu les lies entre elles par des relations (1 à plusieurs, plusieurs à plusieurs, etc., qui seront interprétées comme des NSSet).

Une fois que tu as ton modèle fonctionnel, il faut "remplir les tables" (instancier les classes) à l'aide de [NSManagedObject insertNewObjectForEntityForName"leNomDeTaTable" inManagedObjectContext:tonContexte], puis tu pourras ensuite accéder aux objets stockés dans ton modèle à l'aide des NSFetchRequest...

Bon, c'est vraiment schématisé et si un puriste passe par là il me casse en deux, mais si tu dois retenir deux choses :
1/ ne commence pas ton apprentissage par CoreData
2/ CoreData est juste là pour te simplifier la tâche, il se charge seulement de t'aider à créer un modèle de données ainsi que les relations entre les classes, à "synthesizer" les propriétés de tes classes, à accéder à tes instances par un système de requêtes et à faire persister les données pour que tu puisses y accéder lors d'un prochain lancement de l'appli.

En tout cas le fonctionnement ne coule pas de source et encore une fois trouve un bouquin et apprends depuis le début, tu verras que CoreData c'est plutôt un truc qu'on attaque vers la fin.


----------



## BooBoo (29 Septembre 2010)

Oublie Core Data et utilise les propertyList.
C'est moins puissant, mais au moins, tu comprendras ce que tu fera !!


----------

