[résolu] Mogenerator et NSPersistentDocument

colas_colas_ Membre
mai 2013 modifié dans Objective-C, Swift, C, C++ #1

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.


 


@end


 


 


@implementation Entity


 


// Custom logic goes here.


 


+ (id)insertInManagedObjectContext:(NSManagedObjectContext *)moc_


{


    id obj = [super insertInManagedObjectContext:moc_];


    


    [Entity findAll] ;


 


    return obj ;


}


@end


 


 


 


 


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 !


Réponses

  • AliGatorAliGator Membre, Modérateur
    Dans Entity.h la classe Entity dérive bien de la classe _Entity générée par mogenerator qui dérive bien lui-même de NSManagedObject?


    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?
  • colas_colas_ Membre
    mai 2013 modifié #3

    La classe Entity dérive bien de _Entity (tout ça est généré automatiquement par Mogenerator).



    #import "_Entity.h"

    @interface Entity : _Entity {}
    // Custom logic goes here.
    @end


    Pour l'install de Magical Record, j'ai importé les classes et j'ai ajouté le code suivant dans mon -Prefix.pch :



    #ifdef __OBJC__
    #import <Cocoa/Cocoa.h>
    // Cocoa Lumberjack
    #import "MYLog.h"
    #endif

    #ifdef DEBUG
    //static const int ddLogLevel = LOG_LEVEL_DEBUG;
    static int ddLogLevel = LOG_LEVEL_VERBOSE;
    #else
    static int ddLogLevel = LOG_LEVEL_ERROR;
    #endif

    //Magical record
    #ifdef __OBJC__
    #define MR_SHORTHAND
    #import "CoreData+MagicalRecord.h"
    #endif

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


  • colas_colas_ Membre

    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];


    ...


    }
  • colas_colas_ Membre

    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 !


  • AliGatorAliGator Membre, Modérateur
    mai 2013 modifié #7

    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.


  • colas_colas_ Membre

    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

  • colas_colas_ Membre
    mai 2013 modifié #9

    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 !


Connectez-vous ou Inscrivez-vous pour répondre.