[swift] core data relationship

ShaolinShaolin Membre
juin 2016 modifié dans Objective-C, Swift, C, C++ #1

Bonjour,


 


je recherche de l'aide pour comprendre comment jouer avec les relations dans core data.


Avant tout je suis vraiment débutant sur ios, j'ai lu et acheté des cours vidéo sur udemy la plupart sont en anglais et biensur je ne maitrise pas trop trop cette langue, les livres en français sur ce sujet sont inexistant (à  part swift pour les nuls mais qui as de mauvaises critiques et qu'il ne parle pas de core data)


 


en bref je suis larguer !


 


la partie vue, formulaire, enregistrement classique ça va pour l'instant c'est vraiment la partie stockage des données avec des relations ou je bloque.


 


quelqu'un aurait-il un exemple simple ou un tuto simple à  me conseiller pour comprendre comme celà  fonctionne ?


 


exemple d'aprés les tutos que j'ai pus lire :


j'ai une entité "Auteur" et un attribut "nomAuteur" et une entité "Livre" avec un attribut "nomLivre" comment faire en swift pour enregistré un auteur et 2 livres ? 


 


puis ensuite ajouter un livre à  un auteur, lister les livres suivant un auteur et supprimer un livre d'un auteur.


 


si quelqu'un veut bien consacrer du temps à  m'orienter ou mieux en faire un tuto en francais je serais ravis, et sa manque sur le net. 


 


Je suis habitué au PHP, javascript, MySQL je faisait mes app avec sencha touch mais aujourd'hui je voudrais développer des applications natives.

Réponses

  • Normalement, Draken va te répondre.


  • Pourquoi moi ? Je ne connais rien à  CoreData, moi .. Et le MOC de Jussieu sur la programmation iOS (voir le lien de ma signature) n'aborde pas ce sujet.

  • CéroceCéroce Membre, Modérateur
    juin 2016 modifié #4

    je recherche de l'aide pour comprendre comment jouer avec les relations dans core data.
    Avant tout je suis vraiment débutant sur ios,

    À mon avis, "débutant" et "Core Data", ne sont pas vraiment compatibles.
    Jette tout de même un oe“il à  cette bibliothèque qui aide pas mal: https://github.com/magicalpanda/MagicalRecord
     

    exemple d'aprés les tutos que j'ai pus lire :
    j'ai une entité "Auteur" et un attribut "nomAuteur" et une entité "Livre" avec un attribut "nomLivre" comment faire en swift pour enregistré un auteur et 2 livres ?

    Déjà , crée ton schéma dans Xcode. Appelle plutôt les attributs "nom" plutôt que "nomLivre" et "nomAuteur" (pourquoi se répéter). Type-les en String.
    Un livre peut avoir plusieurs auteurs et un auteur peut avoir écrit plusieurs livres. Tu auras donc une relation "many-to-many" bidirectionnelle, qui s'appelle 'livres' dans Auteur, et 'auteurs' dans Livre.

    Ensuite, typiquement on va créer des sous-classes de NSManagedObject pour Livre et Auteur. Utilise le menu Editor > Create NSManageObject Subclass.
    Tu auras donc des classes Livre et Auteur.

    On ne peut pas instancier un NSManagedObject comme les autres objets; il faut demander au NSManagedObjectContext (MOC). Dans le template d'Apple par défaut, le MOC est créé par l'AppDelegate.
     

    puis ensuite ajouter un livre à  un auteur, lister les livres suivant un auteur et supprimer un livre d'un auteur.


    Je connais encore mal Swift, alors je me suis pris la tête avec les optionals, mais ceci crée un Livre et un Auteur, les nomme, et les associe:

    (Dans AppDelegate.swift, pour avoir accès au MOC)
     
        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    guard let auteur = NSEntityDescription.insertNewObjectForEntityForName("Auteur", inManagedObjectContext: self.managedObjectContext) as? Auteur else {
    return false
    }
    auteur.nom = "Montaigne"

    guard let livre = NSEntityDescription.insertNewObjectForEntityForName("Livre", inManagedObjectContext: self.managedObjectContext) as? Livre else {
    return false
    }

    livre.nom = "Les Essais"
    livre.auteurs = NSSet.init(array: [auteur])


    return true
    }
    Tu remarqueras que la relation auteur.livres est bien fixée quand on fixe la relation inverse (livre.auteurs).
    Tu peux énumérer les auteurs ou les livres avec une simple boucle for sur le NSSet.
    Je te laisse chercher pour la suppression, ce n'est pas très difficile (cherche dans NSManagedObjectContext).
  • LarmeLarme Membre

    Je rejoins @Ceroce:


    Débutant + CoreData, ça ne fait pas bon ménage en général, de quoi dégoûter les nouveaux surtout...


    Pour CoreData, il faut un peu de connaissances en BdD en général (relations, delete cascade, etc.), ne pas avoir peur des appels asynchrones, des NSPredicate, de ne pas hésiter à  utiliser MagicalRecord (et donc conseiller CocoaPods ou assimilé), etc.


     


     


     


    Sinon, je suis un peu perdu.


    Tu as fait du PHP, JavaScript, et tu ne maà®trise pas trop l'anglais ?


    Conseil : Dans le monde de la programmation, l'anglais peut se révéler plus qu'utile. Car les solutions à  des problèmes spécifiques seront en général en anglais.


    Tu as fait du MySQL, et les relations entre entités te semblent complexes, ou c'est les coder en Swift (pas sûr d'avoir compris) ?

  • Shaolin, tu trouveras dans la signature de Draken des dizaines d heures de tutoriel en français !


  • Pourquoi moi ? Je ne connais rien à  CoreData, moi .. Et le MOC de Jussieu sur la programmation iOS (voir le lien de ma signature) n'aborde pas ce sujet.




     


    Merci draken pour ce lien une vrai pépite ce site par contre oui dommage il parle pas de core data.


     




    À mon avis, "débutant" et "Core Data", ne sont pas vraiment compatibles.

    Jette tout de même un oe“il à  cette bibliothèque qui aide pas mal: https://github.com/magicalpanda/MagicalRecord

     

    Déjà , crée ton schéma dans Xcode. Appelle plutôt les attributs "nom" plutôt que "nomLivre" et "nomAuteur" (pourquoi se répéter). Type-les en String.

    Un livre peut avoir plusieurs auteurs et un auteur peut avoir écrit plusieurs livres. Tu auras donc une relation "many-to-many" bidirectionnelle, qui s'appelle 'livres' dans Auteur, et 'auteurs' dans Livre.


    Ensuite, typiquement on va créer des sous-classes de NSManagedObject pour Livre et Auteur. Utilise le menu Editor > Create NSManageObject Subclass.

    Tu auras donc des classes Livre et Auteur.



     




     


    Merci beaucoup Céroce d'avoir pris le temps de m'orienter je reprend espoir.


    oui débutant et core data c'est pas top, mais je trouvé ça pratique de passer par un outil interne . merci pour magicalRecord je vais regarder ça de prés.


     


    pour la création des sous classes c'est justement à  ce moment que le tuto sur udemy s'arrête, je pensé pouvoir récupérer mes attributs de la sorte auteur.nomAuteur et auteur.nomLivre c'est pour ça que j'avais différencié les noms mais je n'étais pas sur la bonne voie...


     




    Je rejoins @Ceroce:


    Débutant + CoreData, ça ne fait pas bon ménage en général, de quoi dégoûter les nouveaux surtout...


    Pour CoreData, il faut un peu de connaissances en BdD en général (relations, delete cascade, etc.), ne pas avoir peur des appels asynchrones, des NSPredicate, de ne pas hésiter à  utiliser MagicalRecord (et donc conseiller CocoaPods ou assimilé), etc.


     


     


     


    Sinon, je suis un peu perdu.


    Tu as fait du PHP, JavaScript, et tu ne maà®trise pas trop l'anglais ?


    Conseil : Dans le monde de la programmation, l'anglais peut se révéler plus qu'utile. Car les solutions à  des problèmes spécifiques seront en général en anglais.


    Tu as fait du MySQL, et les relations entre entités te semblent complexes, ou c'est les coder en Swift (pas sûr d'avoir compris) ?




     


    PHP, Javascript je fais même du C (arduino) mais on trouve énormément de doc et livre en français sur ces langages (même si j'ai était amené à  acheter des livres en anglais sur des parties plus technique) 


     


    là  ios de maniére générale je pensé pas avoir autant de mal c'est trés verbeux je trouve et y a pas de mal de concept qu'on ne rencontre pas dans le PHP ou le Javascript. heureusement cococafé est en français :-)


     


    les relations dans des BDD tel que MySQL y a pas de soucie mais c'est effectivement de les coder en Swift 


     


    sinon à  part la console dans XCODE et user du print() pour vérifier ses enregistrements y a pas un outil pour agir sur la BDD tel que PhpMyAdmin pour MySQL ?


     


    j'ai l'impression d'être le seul à  avoir autant de mal avec les relations dans coreData on trouve pas beaucoup de question à  ce sujet je dois surement passer à  coté de quelques choses...

  • Si tu es vaillant Shaolin, installe mogenerator et CoreData sera beaucoup mieux.
  • CéroceCéroce Membre, Modérateur

    sinon à  part la console dans XCODE et user du print() pour vérifier ses enregistrements y a pas un outil pour agir sur la BDD tel que PhpMyAdmin pour MySQL ?

    Je déconseille d'utiliser print() ou NSLog() pour déboguer. Cette technique présente trois inconvénients:
    - il faut modifier le code, donc le rebuilder et relancer le programme
    - on ne voit que ce qu'on a décidé d'afficher
    - l'enchaà®nement des séquences nous échappe.

    On dispose d'un outil superbe, qui s'appelle un débogueur. C'est très simple à  utiliser: on place un point d'arrêt (breakpoint) dans la marge, et le programme s'arrête dessus. Ensuite, on peut inspecter toutes les variables de la portée courante et même lancer des commandes.

    Pour revenir à  Core Data, il ne faut pas penser "base de données" mais "graphe d'objets". Certes, c'est une base SQLite qui sert au stockage, mais Core Data sert justement à  s'en abstraire (on appelle ça une ORM " Object-Relationship Mapping). D'ailleurs, il existe une option pour opter pour un stockage XML qui sert justement à  déboguer. Tu peux ouvrir le fichier Core Data avec un éditeur de base SQLite, et tu verras tes entités, mais également que la structure n'est pas vraiment exploitable.

    Si vraiment tu veux exploiter une base de données, c'est possible. Il existe des wrappers pour SQLite, aussi bien en ObjC qu'en Swift. C'est une autre approche, d'ailleurs tout à  fait conseillable " alors que l'expérience me fait émettre de très grosses réserves sur Core Data.

    Jette aussi un oe“il à  Realm.io. C'est encore une autre approche, mais pour le coup, plus conviviale que Core Data.
  • merci pour votre aide 


     


    pour ceux qui se poser les mêmes questions que moi si ça peut aider je m'en suis sortie avec ça :


     


    pour persister avec core data ce super tuto m'as beaucoup aidé à  comprendre


    http://code.tutsplus.com/tutorials/core-data-and-swift-relationships-and-more-fetching--cms-25070


     


    Merci céroce pour le wrapper j'ai trouvé : https://github.com/stephencelis/SQLite.swift


    et le tuto qui vas bien avec https://www.raywenderlich.com/123579/sqlite-tutorial-swift


    le tout avec http://sqlitebrowser.orgpour visualiser la base de données sans faire des print() partout je me sent moins dépayser en voyant les requetes sql.


     


    je viens de voir ton site je suis picard aussi :-)


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