CoreData syntaxe

paozpaoz Membre
juin 2014 modifié dans Objective-C, Swift, C, C++ #1

Bonjour à  tous,


 


Après avoir suivi plusieurs tutos, je me demande si la syntaxe obligatoire pour créer un objet avec CoreDate est forcément la suivante :



NSManagedObjectContext *context = [self managedObjectContext];

NSEntity *produit = [NSEntityDescription insertNewObjectForEntityForName:@Produit inManagedObjectContext:context];
[produit setValue:@Test forKey:@name];
[produit setValue:@Test forKey:@type];

NSError *error;
if (![context save:&error]) {
NSLog(@Whoops, couldn't save: %@", [error localizedDescription]);
}

Ou alors peut-on faire la chose suivante :



NSManagedObjectContext *context = [self managedObjectContext];

NSEntity *entity= [NSEntityDescription insertNewObjectForEntityForName:@Produit inManagedObjectContext:context];

Product *product = [[Product allo] initWithEntity: entity insertIntoManagedObjectContext: context];

product.name = @test;
product.type = @test;

NSError *error;
if (![context save:&error]) {
NSLog(@Whoops, couldn't save: %@", [error localizedDescription]);
}

La première syntaxe me semblant évidemment beaucoup plus lourde !


 


Merci pour les réponses :)


Réponses

  • CéroceCéroce Membre, Modérateur
    juin 2014 modifié #2
    Pour utiliser la seconde, il faut créer une sous-classe de NSManagedObject (menu Editor > Create NSManagedObject subclass...), alors tu pourras utiliser les propriétés qui seront déclarées dans le .h.

    Autrement, on ne dispose pas de propriétés, et il faut effectivement passer par le Key-Value Coding comme tu le montres dans le 1er exemple.
  • paozpaoz Membre

    Et donc forcément inclure les .h partout ou on en a besoin ?


     


    Donc en réalité, la première syntaxe est plus lourde, mais évite d'inclure tous ces .h à  chaque fois ?


  • CéroceCéroce Membre, Modérateur
    juin 2014 modifié #4
    Oui, il faut effectivement inclure les .h.
    Personnellement, je crée presque toujours un NSManagedObject par entité. Pour deux raisons:

    1) ça permet en plus d'avoir des propriétés "scalaires". Ainsi, je peux avoir une propriété déclarée
    @property (assign) double latitude;
    et l'affecter directement
    place.latitude = 48.23;
    2) il y a certaines méthodes qu'on ne saurait pas où mettre, alors qu'elles sont directement en lien avec l'entité.
  • KubernanKubernan Membre
    juin 2014 modifié #5

    Petite correction : 








    NSManagedObjectContext *context = [self managedObjectContext];

    //NSEntity *entity= [NSEntityDescription insertNewObjectForEntityForName:@Produit inManagedObjectContext:context];

    // Product *product = [[Product allo] initWithEntity: entity insertIntoManagedObjectContext: context];
    // C'est plutôt comme ca
    Product *product= [NSEntityDescription insertNewObjectForEntityForName:@Produit inManagedObjectContext:context];

    product.name = @test;
    product.type = @test;

    NSError *error;
    if (![context save:&error]) {
    NSLog(@Whoops, couldn't save: %@", [error localizedDescription]);
    }



    Et pour les .h du model, je les met dans le .pch (mais je crois que ça a changé cette façon de faire).


  • paozpaoz Membre


    Oui, il faut effectivement inclure les .h.

    Personnellement, je crée presque toujours un NSManagedObject par entité. Pour deux raisons:


    1) ça permet en plus d'avoir des propriétés "scalaires". Ainsi, je peux avoir une propriété déclarée



    @property (assign) double latitude;

    et l'affecter directement

    place.latitude = 48.23;

    2) il y a certaines méthodes qu'on ne saurait pas où mettre, alors qu'elles sont directement en lien avec l'entité.

     




    Oui 1 pour l'autocomplétion aussi, et 2 pour l'ajout de méthode à  postériori, ca me semble évident.


  • @paoz, tu as l'air d'être expérimenté. Je te conseille vivement d'installer mogenerator, car avec la génération des classes made Apple si tu changes ton modèle et que tu régénères tes classes, tu perds tout ton code... mogenerator c'est la classe


    Autre choses à  savoir, l'implementation des relations to many non ordered d'Apple est buguee mais il y a un bon fix sur github (recherche sur Google si tu en as besoin)


    Tu peux aussi aller jeter un coup d'oeil à  cbdcoredatatoolkit.
  • AliGatorAliGator Membre, Modérateur
    MagicalRecord...


  • @paoz, tu as l'air d'être expérimenté. Je te conseille vivement d'installer mogenerator, car avec la génération des classes made Apple si tu changes ton modèle et que tu régénères tes classes, tu perds tout ton code... mogenerator c'est la classe


     




     


    Et si paoz était passé par la case présentation, ce serait plus clair pour tout le monde !! ;)

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