Importer des données Core Data dans mon application

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

J'ai un NSPersistentDocument, avec son modèle Core Data, etc.


 


J'ai un fichier, créé par ce document. Il s'appelle preload.xml. Il "contient" plusieurs NSManagedObject.


 


Je voudrais charger ces objets dans tous mes nouveaux documents, de telle sorte que quand je crée un nouveau document, ce dernier automatiquement "possède" les objets vivants dans prelaod.xml. Voici ce que j'ai fait jusque là  :


 


  • J'ai copié preload.xml dans mon projet.
  • Dans la méthode initWithType:error: (méthode qui est appelé pour la création des nouveaux documents), j'ai le code suivant :

    NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle]
    pathForResource:@preload
    ofType:@xml]];
    NSError* err = nil;

    [self readFromURL:preloadURL
    ofType:@xml
    error:&err] ;

    (self est le document)


     


     


    Ceci ne marche pas car quand j'essaie ensuite de sauvegarder mon document dans un fichier (disons myDoc.xml), ce document myDoc.xml reste vide et tout va dans preload.xml.


     


    Je me demande si j'ai besoin de créer un nouveau store ou un nouveau storecoordinator ou un nouveau context. Jusque là  je n'ai pas eu à  gérer des objets comme le store ou le model, car NSPersistentDocument se charge de tout.


     


    Si vous avez des pistes à  me proposer, je suis preneur !


     


    Merci !


Réponses

  • colas_colas_ Membre

    J'y suis arrivé. Voilà  les idées :


    • Recréer un StoreCoordinator, un Store associé à  l'URL du fichier à  importer et un MOC
    • Cloner les objets du nouveau MOC vers le MOC du document. Cette partie est un peu bancale.

    Voilà  le code



    /*
    On récupère les données ayant été crées en preload
    */


    // Création d'un NSPersistentStoreCoordinator
    // et d'un NSPersistentStore associé à  preload.xml
    NSPersistentStoreCoordinator * newPersStoreCoord = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel] ;

    NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle]
    pathForResource:@preload
    ofType:@xml]];


    [newPersStoreCoord addPersistentStoreWithType:NSXMLStoreType
    configuration:nil
    URL:preloadURL
    options:nil
    error:NULL] ;

    // Création d'un MOC associé
    NSManagedObjectContext * newMOC = [[NSManagedObjectContext alloc] init] ;
    [newMOC setPersistentStoreCoordinator:newPersStoreCoord] ;

    NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@TypeHeader];
    NSArray * arrayTypeHeaders = [newMOC executeFetchRequest:request
    error:NULL] ;


    for(TypeHeader * obj in arrayTypeHeaders)
    {
    [obj cloneOnlyAttribuesToContext:self.managedObjectContext
    exludeAttributes:@[;@id]] ;
    }


    NSFetchRequest * requestBis = [NSFetchRequest fetchRequestWithEntityName:@TypeHeader];
    NSSortDescriptor * mySort = [NSSortDescriptor sortDescriptorWithKey:@manualId
    ascending:YES] ;
    [requestBis setSortDescriptors:@[;mySort]] ;
    arrayTypeHeaders = [self.managedObjectContext executeFetchRequest:requestBis
    error:NULL] ;



    Je me suis inspiré de http://stackoverflow.com/questions/2730832/how-can-i-duplicate-or-copy-a-core-data-managed-object

     pour cloner mes objets CoreData.

  • sinon utilise MagicalRecord...


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