Daten synchron halten zwischen Datenbank-Anzeige



  • Hallo!

    In meinem Projekt verwende ich ein Objekt der Klasse StomachDB:

    class StomachDB
    {
      const sAnimalData LoadAnimal(int ID)
      {
        // Code zum laden ...
        // ...
    
        return m_Anims[ID];
      }
    
      void DeletePartFromAnimal(int ID)
      {
        // Die daten des tieres werden hier verändert, zB anzahl geladener Dateien usw.
        m_Anims[ID].VeraendereDaten();
      }
    
      std::vector<sAnimalData> m_Anims;
    };
    

    Über die Methode LoadAnimal lade ich ein Tier (also dateien über das Tier, wie muster etc.) von der Festplatte und gebe eine const-Referenz auf das Tier zurück, welche pointer zu bildern usw., enthält.
    Die Methode DeletePartFromAnimal löscht eine Datei von dem Tier von der Festplatte und gibt auch Speicher für geladenene Bilder usw frei.
    Dadurch dass ich eine const-Referenz zurückgebe, ist der Benutzer ja auch immer aktuell, weil er ja auf den selben speicher guckt wie StomachDB auch.

    Jetzt aber folgendes:

    class DBView
    {
      void Display()
      {
        // zeige alle Muster vom gerade geladenen tier
      }
    
      void Machwas()
      {
        // Ab hier ist m_currData nicht mehr aktuell, weil die DB verändert worden ist
        g_StomachDB->DeletePartFromAnimal(m_CurrData.ID);
        // das würde abhilfe schaffen, ist aber nicht gut
        m_CurrData = g_StomachDB->LoadAniaml(m_CurrData.ID);
        // Denn dadurch wird der referenzzähler intern erhöht und der Speicher des 
        // Tieres wird nich richtig freigegeben
      }
    
      sAnimalData m_CurrData;
    }
    

    Ich bräuchte also sozusagen im DBView-Objekt eine const-Referenz auf die Daten der StomachDB. Leider kann man ja Referenzen als member nur im konstruktor initialisieren, das gerade geleadene Tier variiert aber im laufe des lebens von DBView.

    class DBView
    {
      // Muss im konstruktor initialisert werden und kann nicht was anderes zu gewiesen werden
      const sAnimalData& m_CurrData;
    }
    

    Mit pointern hab ichs mir auch schon überlegt, ob das ginge, aber ehrlich gesagt find ich das hässlich.
    Habt ihr Ideen wie man das elegant lösen könnte? Dass die Daten zwischen DB und View synchron sind? Ein Observer-Pattern ist hier overkill, da der view ja weiß, wann er die daten braucht. Allerdings bekomme ich eine neue sAnimalData ja nur über LoadAnimal und neu laden will ich nicht.

    Hoffe, ihr könnt helfen 🙂
    Maxi



  • Hallo zur späten Stunden. Hoffe mal das ich dein Problem richtig verstanden.
    Also du übergibst die ID von CurrData an Delete.(). Diese ändern das richtige CurrData im Vektor.
    Nun hat CurrData aber noch alte unveränderte Daten. Und du willst das er sein aktualisertes Ich aus dem Vektor enthält.

    Wenn ja, wie wärst damit:

    void DeletePartFromAnimal(sAnimalData& data)
      {
        // Die daten des tieres werden hier verändert, zB anzahl geladener Dateien usw.
        m_Anims[data.ID].VeraendereDaten();
        data = m_Anims[data.ID];
      }
    //....
    void Machwas()
      {
        g_StomachDB->DeletePartFromAnimal(m_CurrData);    
      }
    


  • Maxi schrieb:

    ... Ein Observer-Pattern ist hier overkill...

    Warum? Jedes Tier registriert sich bei der DB als Listener und wenn etwas an seinen Daten verändert wird, wird das tier über die Änderung informiert und passt seine Daten an.


Anmelden zum Antworten