[swift] core data relationship
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.
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.
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.
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)
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).
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) ?
Merci draken pour ce lien une vrai pépite ce site par contre oui dommage il parle pas de core data.
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...
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...
- 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 :-)