[résolu] Mogenerator et NSPersistentDocument
colas_
Membre
J'ai essayé d'utiliser MagicalRecord dans les classes dérivées de NSManagedObject créées par Mogenerator.
ça plante, en me disant : +[Entity createEntity]: unrecognized selector sent to class 0x100059ba0
Par exemple, le code suivant plante chez moi
// Code généré par Mogenerator
#import "Entity.h"
@interface Entity ()
// Private interface goes here.
@implementation Entity
// Custom logic goes here.
+ (id)insertInManagedObjectContext:(NSManagedObjectContext *)moc_
{
id obj = [super insertInManagedObjectContext:moc_];
[Entity findAll] ;
return obj ;
}
Avez-vous été confronté à ce problème ?
J'ai trouvé un message sur SO : http://stackoverflow.com/questions/15658029/coredata-magical-record-and-mogenerator mais ce n'est pas hyper concluant.
Merci !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Mais surtout, tu as bien linké MagicalRecord a ton projet ? Tu l'as inclus comment dans ton workspace? Si tu l'as inclus sous forme d'une lib tu as bien mis le flag -ObjC dans tes Build Settings pour être sur d'importer toutes les catégories et pas que les classes de la lib?
La classe Entity dérive bien de _Entity (tout ça est généré automatiquement par Mogenerator).
Pour l'install de Magical Record, j'ai importé les classes et j'ai ajouté le code suivant dans mon -Prefix.pch :
Remarque : le code bugue au runtime et je crée une instace de Entity avec le code [Entity createEntity], ce qui prouve bien que MR est chargé.
Je pense que mon problème est tout autre en fait !
Rien à voir avec mogenerator !
J'utilise MagicalRecord (MR) avec NSPersistentDocument, et je pense qu'avant d'utiliser les méthodes de MR, je dois faire une sorte d'initialisation de MR. Je vais chercher dans cette direction.
dans
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
[MagicalRecord setupCoreDataStackWithStoreNamed:@main.sqlite];
...
}
dans
- (void)applicationWillTerminate:(UIApplication *)application
[MagicalRecord cleanUp];
Je ne sais pas si ça va marcher car une document-based application, il y a un MOC par document ouvert...
On a l'impression qu'avec la méthode que tu proposes, il y aura un MOC pour toute l'application...
Merci en tout cas !
Ah oui il faut faire un setupCoreDataStack ça c'est sûr ! Ou l'équivalent à la main
setupCoreDataStack, c'est lui qui fait toute la mécanique d'initialisation de ton contexte CoreData, c'est à dire initialisation d'un PersistentStoreCoordinator et son PersistentStore lié au fichier sqlite, initialisation de ton ManagedObjectModel en récupérant un merge de tous les xcdatamodel de ton Bundle, initialisation du defaultContext, .. Bref en gros tout ce que fait le template Xcode pour projet CoreData habituellement, avec plein de lignes de code, que tu peux faire à la main comme à l'ancienne, ou avec juste les méthodes de commodité de MagicalRecord (les "setupCoreDataStack" et variantes), mais dans tous les cas faut bien le faire au démarrage !
Etant très orienté iPhone/iOS de mon côté, je n'ai jamais eu la problématique d'avoir à gérer du multi-document avec CoreData comme toi sous OSX, mais on peut très bien créer même sous iOS autant de MOC qu'on veut, donc y'a pas de raison que ça marche pas pareil sous OSX. C'est juste ton PSC et ton MOM qu'il faut bien initialiser au démarrage dans tous les cas pour les lier au bon DataModel et à la bonne base Sqlite derrière.
En fait, les document-based application (avec CoreData) gèrent automatiquement le set-up de la stack.
Une instance de NSPersistentDocument possède une @propery managedObjectContext qui est opérationnelle dés l'unit de cette instance. Pas de set-up à faire.
Ce qui m'a bloqué c'est comment relier cette stack déjà opérationnelle à MR.
Je pensais que je pouvais utiliser les méthodes de MR sans avoir à faire d'initialisation, mais ça a bugué.
Pour l'instant, je n'avais qu'une requête @max à faire, je l'ai faite sans MR.
Pour ceux qui lisent, je suis d'ailleurs tombé sur un bug de @max que je pense lié aux autosave : http://stackoverflow.com/questions/4387403/nscfnumber-count-unrecognized-selector
Problème résolu :
pour utiliser MR avec NSPersistentDocument, il faut utiliser les méthodes qui se terminent par withContext et spécifier le MOC du NSPersistentDocument
MAIS, avant de faire ça il faut faire [MagicalRecord initialize] ;
Bon, comme c'est mal d'appeler initialize... on peut faire [MagicalRecord class] ; à la place, ce qui va aussi loader la classe
Plus "propre" : [MagicalRecord cleanUp]
cool !