Partage
  • Partager sur Facebook
  • Partager sur Twitter

Apllication en swift avec CoreData

Sujet résolu
    4 décembre 2018 à 9:43:17

    Bonjour à je fais en ce moment une application en swift, pour la Bdd j'utilise coredata et son outil graphique. Voici le schéma de ma Bdd

    Je vous explique brievement une biere contient une liste de Bar et une marque (Brand)

    Voila ou cela ce complique j'entre les données avec des outlet et une action sur le bouton poussoir voici le code :

    import UIKit
    import CoreData
    
    class NewBrandViewController: UIViewController {
    
        @IBOutlet weak var NoteBrand: UITextField!
        @IBOutlet weak var StoryBrand: UITextField!
        @IBOutlet weak var placeBrand: UITextField!
        @IBOutlet weak var NameBrand: UITextField!
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Do any additional setup after loading the view.
        }
    
        func CheckCaseEmptyOrNot() -> Bool {
            if (StoryBrand.text?.isEmpty == true && placeBrand.text?.isEmpty == true && NameBrand.text?.isEmpty == true )
            {
                return false
            }
            else
            {
                return true
            }
        }
        
        @IBAction func PushButtonValid(_ sender: Any)
        {
            if (CheckCaseEmptyOrNot()==true)
            {
                let appDelegate = UIApplication.shared.delegate as! AppDelegate
                let context = appDelegate.persistentContainer.viewContext
                
                let newBrand = NSEntityDescription.insertNewObject(forEntityName: "Brand", into: context)
    
                newBrand.setValue(NameBrand.text , forKey: "name")
                newBrand.setValue(placeBrand.text , forKey: "place")
                newBrand.setValue(StoryBrand.text , forKey : "history")
                newBrand.setValue(NoteBrand.text, forKey: "note")
                
                do
                {
                    try context.save()
                    print("Save")
                }
                catch
                {
                    print("Erreur !! impossible de sauvegarder les données")
                }
            }
                
            else
            {
                print ("Veuillez remplir tous les champs")
            }
            
       }
    }

    Lorsque je lance l'action l'application freeze m'affiche une erreur "Thread 1 : signal GBRT" dans la console.

    Je vous le datamodel de ma BDD :

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="13533" systemVersion="16G1618" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
        <entity name="Bar" representedClassName="Bar" syncable="YES" codeGenerationType="class">
            <attribute name="adresse" optional="YES" attributeType="String" syncable="YES"/>
            <attribute name="horraire" optional="YES" attributeType="String" syncable="YES"/>
            <attribute name="nom" optional="YES" attributeType="String" syncable="YES"/>
            <attribute name="note" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/>
            <attribute name="prix" optional="YES" attributeType="Float" defaultValueString="0.0" usesScalarValueType="YES" syncable="YES"/>
            <relationship name="itemsBeer" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="Beer" inverseName="bar" inverseEntity="Beer" syncable="YES"/>
        </entity>
        <entity name="Beer" representedClassName="Beer" syncable="YES" codeGenerationType="class">
            <attribute name="barCode" optional="YES" attributeType="String" syncable="YES"/>
            <attribute name="comment" optional="YES" attributeType="String" syncable="YES"/>
            <attribute name="name" optional="YES" attributeType="String" syncable="YES"/>
            <attribute name="photo" optional="YES" attributeType="String" syncable="YES"/>
            <attribute name="power" optional="YES" attributeType="String" syncable="YES"/>
            <attribute name="type" optional="YES" attributeType="String" syncable="YES"/>
            <relationship name="bar" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="Bar" inverseName="itemsBeer" inverseEntity="Bar" syncable="YES"/>
            <relationship name="brand" maxCount="1" deletionRule="Nullify" destinationEntity="Brand" inverseName="products" inverseEntity="Brand" syncable="YES"/>
        </entity>
        <entity name="Brand" representedClassName="Brand" syncable="YES" codeGenerationType="class">
            <attribute name="history" optional="YES" attributeType="String" syncable="YES"/>
            <attribute name="name" optional="YES" attributeType="String" syncable="YES"/>
            <attribute name="note" optional="YES" attributeType="Integer 16" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/>
            <attribute name="place" optional="YES" attributeType="String" syncable="YES"/>
            <relationship name="products" optional="YES" toMany="YES" deletionRule="Cascade" destinationEntity="Beer" inverseName="brand" inverseEntity="Beer" syncable="YES"/>
        </entity>
        <elements>
            <element name="Bar" positionX="16" positionY="-36" width="128" height="133"/>
            <element name="Beer" positionX="-207" positionY="230" width="128" height="165"/>
            <element name="Brand" positionX="-387" positionY="-27" width="128" height="120"/>
        </elements>
    </model>



    J'ai le message suivant

    Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Brand'


    . Apres plusieurs recherche je ne trouve pas la solution. Je me tourne donc vers vous.

    Merci de votre aide

    -
    Edité par klemenpolfr 4 décembre 2018 à 12:16:04

    • Partager sur Facebook
    • Partager sur Twitter
      4 décembre 2018 à 11:02:12

      Salut, 

      Disclaimer : Je ne connais pas vraiment CoreData, je préfère Realm. J'ai quand même fait une petite recherche pour essayer de t'aider !

      L'erreur semble dire que viewContext est nil (ou persistentContainer selon son type). Je ne connais pas cet objet, il faut regarder comment il est initialisé pour comprendre le problème.

      J'ai (je pense) trouvé le tuto sur lequel tu te bases. persistentContainer est créé comme ça : 

      let container = NSPersistentContainer(name: "CoreDataDemo")

      Si je regarde les autres fichiers je vois que son model se nomme :

      CoreDataDemo.xcdatamodeld

      Je suppose donc que le name du container doit correspondre au name de xcdatamodeld. C'est ton cas ?


      • Partager sur Facebook
      • Partager sur Twitter
        4 décembre 2018 à 14:28:41

        Non j'ai utilisé ce tuto : https://www.youtube.com/watch?v=V1XjH7lHtrE&t=990s

        Donc dans mon cas CoreDataDemo = Brand

        Je te cache pas j'ai du mal à comprendre :/

        -
        Edité par klemenpolfr 4 décembre 2018 à 14:29:35

        • Partager sur Facebook
        • Partager sur Twitter
          4 décembre 2018 à 14:41:54

          J'ai passé la vidéo en très accéléré et j'ai pas vu le AppDelegate. (Je déteste les tutos vidéos..)

          Brand c'est un objet pas le nom de ta base. Dans ton appDelegate il est créé comment le persistentContainer ? C'est quoi le nom de xcdatamodeld ? 

          Sinon tu peux peut-être mettre ton projet sur GitHub, je regarderai

          Sinon, tu peux aussi passer à Realm :D

          -
          Edité par Geda 4 décembre 2018 à 14:42:08

          • Partager sur Facebook
          • Partager sur Twitter
            4 décembre 2018 à 14:55:05

            Si enfaite j'ai fait exactement comme lui et il fait sous cet forme

                        let context = appDelegate.persistentContainer.viewContext
            

            Tiens je te passe mon github : https://github.com/Clementwdk/Beerder

            J'ai regarder Realm parce que je commence à pas vraiment trouver de solution et je dois rendre le projet bientot (cours)

            mais j'ai pas vraimment trouver de tuto qui me plaisait.

            Si tu as des idées je suis preneur :D

            • Partager sur Facebook
            • Partager sur Twitter
              4 décembre 2018 à 14:58:49

              Je trouve que la doc de Realm se suffit à elle même : https://realm.io/docs/swift/latest

              Sinon j'ai regardé le projet en 10s. Fais juste un test : 

              Remplace dans ton appDelegate.swift ligne 54

              let container = NSPersistentContainer(name: "Beerder")
              


              par 

              let container = NSPersistentContainer(name: "Model")

              En bonus :

              https://medium.com/xcblog/core-data-with-swift-4-for-beginners-1fc067cca707 

              https://github.com/Shashikant86/CoreDataDemo

              Ca a l'air d'être l'original de ton tuto Youtube que le mec a copié sans gêne.

              -
              Edité par Geda 4 décembre 2018 à 15:04:29

              • Partager sur Facebook
              • Partager sur Twitter
                5 décembre 2018 à 13:47:53

                Nickel ça marche merci beaucoup!!

                J'avais une autre question, enfaite je voudrais faire une action des qu'une fenetre s'ouvre un peu comme un constructeur en c++ c#, j'ai essayer avec init() mais ça ne fonctionne pas est ce que t'aurais une idée ?

                • Partager sur Facebook
                • Partager sur Twitter
                  5 décembre 2018 à 13:55:08

                  Tu peux être un peu plus clair ? :D qu’est ce qu´une fenetre ? Ça veut dire quoi « ça ne fonctionne pas » ? Qu’as Tu essayé exactement ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 décembre 2018 à 14:04:39

                    En faite j'essaye d'afficher les données dans un table view mais je veux que le tableview s'ouvre et afiche les donées sans qu'il y est d'actions particuliéres

                    On ouvre la page -> les données s'affiche dans le tableView

                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 décembre 2018 à 16:38:02

                      J'imagine que ça crash ? Car ta tableview n'est pas initialisé dans le init()

                      override func viewDidLoad() {
                          super.viewDidLoad()
                          
                          // Récupère les données
                          fetchData()
                      
                          tableView.reloadData()
                      }



                      • Partager sur Facebook
                      • Partager sur Twitter

                      Apllication en swift avec CoreData

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown