MCD et Core Data

Bonjour,

Dans une nouvelle application, je vais utiliser Core Data,
Comment ça se passe pour traduire un modèle conceptuel de données ?

admettons que j'ai un MCD de ce style (pris sur développez.com pour un exemple) :

Est-ce qu'on inclut les ID_Auteur, ID_Emprunteur etc... dans les entités ?

Merci.

Mots clés:

Réponses

  • PyrohPyroh Membre

    Rapidement, voilà une version corrigée de ce diagramme pour CoreData avec les fichiers qui vont bien.
    Il est en effet inutile de mettre des ID pour le fonctionnement interne. Ça peut être utile pour référence externe cela dit.
    Voilà un screen du diagramme.

    Tu trouveras le fichier CoreData en PJ.

    (Maintenant j'attends ceux qui me diront qu'il ne fait pas faire tu To Many-To Many...)

  • LarmeLarme Membre

    En général dans CoreData, tu "linkes" les entités entre elles, et tu n'as pas besoin d'avoir Id_auteur dans l'entité Livre, mais plutôt l'entité "auteur" (toute entière, ou via un Set s'il y a la relation nécessaire).

  • heliohelio Membre

    merci à vous 2, je comprends mieux.
    Mais lorsque par exemple je vais enregistrer un nouveau livre et que je veux y affecter l'auteur du livre.
    ça va se passer comment au niveau du code ?

    livre.setValue("livre 1", forKey: "titre")
    ...
    livre.setValue("2018", forKey: "annee")
    

    et au niveau de la relation ça va donner quoi ?

    Merci.

  • Joanna CarterJoanna Carter Membre, Modérateur

    Bah non. Tu crées les classes et tu fait:

    livre.titre = "livre 1"
    ...
    livre.annee = 2018
    
  • GercofisGercofis Membre

    Heu ! peut-être :
    let livre = Livre ( context: context )
    livre.titre = "livre 1" // peut-être mettre le titre réel quitte a les indexer
    livre.annee = 2018

  • Joanna CarterJoanna Carter Membre, Modérateur

    @Gercofis a dit :
    Heu ! peut-être :
    let livre = Livre ( context: context )
    livre.titre = "livre 1" // peut-être mettre le titre réel quitte a les indexer
    livre.annee = 2018

    N'oubliant pas:

      do
      {
        try context.save()
      }
      catch
      {
        fatalError("Failure to save context: \(error)")
      }
    
  • GercofisGercofis Membre

    c'est la phase d'après, mais nous sommes bien d'accord

  • heliohelio Membre

    Merci à vous,
    mais ce que je voulais dire, c'est que par exemple lorsque je faisais de l'ACCESS, dans ma table livre j'aurais eu :
    IDLivre : Livre 1 | Annee : 2018 | ... | IDAuteur : 1
    IDLivre : Livre 2 | Annee : 2017 | ... | IDAuteur : 1
    IDLivre : Livre 3 | Annee : 2017 | ... | IDAuteur : 2
    Dans CoreData étant donné que je n'ai pas d'index, je mets quoi à la place de l'IDAuteur ? ce sera le nom ?

  • LarmeLarme Membre

    Tu mets une instance dAuteur directement, enfin vu qu'ils peuvent être plusieurs, tu mets un (NS)Set d'Auteurs

  • Joanna CarterJoanna Carter Membre, Modérateur

    Si tu regards la BDD SQLite créée pour un de mes modèles, dans qqch comme Base, tu verras qqch comme :

    … et là, tu vois qu'il y a un "primary key" Z_PK et les "foreign keys" ZARTIST, ZDAY et ZLOCATION.

    En plus, les indexes sont créés pour les "foreign keys" automatiquement.

    Pour le modèle créé par Pyroh, pour la classe Livre, si tu fais "Create NSManagedObject subclass" tu auras deux fichiers :

    // Livre+CoreDataClass.swift
    
    @objc(Livre)
    public class Livre: NSManagedObject
    {
    
    }
    
    // Livre+CoreDataProperties.swift
    
    extension Livre
    {
      @nonobjc public class func fetchRequest() -> NSFetchRequest<Livre>
      {
        return NSFetchRequest<Livre>(entityName: "Livre")
      }
    
      @NSManaged public var annee: NSDate?
      @NSManaged public var dateAchat: NSDate?
      @NSManaged public var dateParution: NSDate?
      @NSManaged public var image: NSData?
      @NSManaged public var isbn: String?
      @NSManaged public var langue: String?
      @NSManaged public var nombrePages: Int16
      @NSManaged public var titre: String?
      @NSManaged public var auteurs: NSSet?
      @NSManaged public var domaines: NSSet?
      @NSManaged public var examplaires: NSSet?
    }
    
    // MARK: Generated accessors for auteurs
    extension Livre
    {
      @objc(addAuteursObject:)
      @NSManaged public func addToAuteurs(_ value: Auteur)
    
      @objc(removeAuteursObject:)
      @NSManaged public func removeFromAuteurs(_ value: Auteur)
    
      @objc(addAuteurs:)
      @NSManaged public func addToAuteurs(_ values: NSSet)
    
      @objc(removeAuteurs:)
      @NSManaged public func removeFromAuteurs(_ values: NSSet)
    }
    
    // MARK: Generated accessors for domaines
    extension Livre
    {
      @objc(addDomainesObject:)
      @NSManaged public func addToDomaines(_ value: Domaine)
    
      @objc(removeDomainesObject:)
      @NSManaged public func removeFromDomaines(_ value: Domaine)
    
      @objc(addDomaines:)
      @NSManaged public func addToDomaines(_ values: NSSet)
    
      @objc(removeDomaines:)
      @NSManaged public func removeFromDomaines(_ values: NSSet)
    }
    
    // MARK: Generated accessors for examplaires
    extension Livre
    {
      @objc(addExamplairesObject:)
      @NSManaged public func addToExamplaires(_ value: Examplaire)
    
      @objc(removeExamplairesObject:)
      @NSManaged public func removeFromExamplaires(_ value: Examplaire)
    
      @objc(addExamplaires:)
      @NSManaged public func addToExamplaires(_ values: NSSet)
    
      @objc(removeExamplaires:)
      @NSManaged public func removeFromExamplaires(_ values: NSSet)
    }
    
  • Joanna CarterJoanna Carter Membre, Modérateur

    @Pyroh a dit :
    Tu trouveras le fichier CoreData en PJ.

    (Maintenant j'attends ceux qui me diront qu'il ne fait pas faire tu To Many-To Many…)

    Peut-être mais il faut dire que tu as raté le One-Many entre Emprunteur et Emprunt :D

  • PyrohPyroh Membre

    @Joanna Carter a dit :
    Peut-être mais il faut dire que tu as raté le One-Many entre Emprunteur et Emprunt :D

    Damned !

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