IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

QxOrm Discussion :

Créer une instance d'objet mappé sans utiliser la classe définie à cet usage


Sujet :

QxOrm

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 151
    Points : 49
    Points
    49
    Par défaut Créer une instance d'objet mappé sans utiliser la classe définie à cet usage
    Bonjour,

    Le problème que j'essaie de résoudre est assez complexe, c'est un point très critique dans ce que je fais, et j'ai eu une idée.
    Je suis toujours sur la conception d'un outil pour modéliser des formulaires reliés à une base de donnée.
    Pour proposer une jonction des formulaires à une base de donnée, dans l'éditeur de formulaire, pour un champ, il est possible de spécifier le nom d'une table et son champ associé dans la base de donnée. Mais aucun schéma de base de donnée n'est défini dans cette partie. Le problème, c'est que tout est générique dans cette partie de l'application (édition de formulaires). Donc pas d'utilisation de QxOrm.

    La seconde partie de l'application est un logiciel médical (appelé mangoo), qui utilise le modélisateur de formulaires (appelé tangoo). Cette partie est spécifique, donc elle utilise QxOrm sans soucis... Sauf pour la gestion des données dans les formulaire...

    Maintenant, j'ai eu une idée en faisant des expérimentations avec QxOrm:
    1. Dans tangoo, je définie simplement les noms des tables et des champs que je veux remplir sur chacun de mes champs.
    2. Dans mangoo, je défini les tables dans des classes avec les champs associés, qui ont donc le même nom que ce qu'on spécifie dans tangoo. Elles font donc partie du contexte QxOrm.
    3. Maintenant, quand je change une valeur dans un de mes champs de formulaire, je voudrais que tangoo utilise le moteur d'introspection de QxOrm pour instancier/modifier l'objet adéquat.
    4. Lorsque je veux enregistrer tout ça dans la base de donnée, je sauve les objets que j'ai instancié.


    En résumé, j'aimerais pouvoir faire ça, et je ne sais pas si c'est possible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Obtenir la table Toto depuis la bdd
    const QString tableName = "Toto";
    qx::IxClass *dbTable = qx::QxClassX::getClass( tableName );
    const QString fieldName = "firstName";
    const QString fieldValue = "Eloi";
    dbTable->setPropertyBag( fieldName, fieldValue );  //Je me trompe peut-être, je veux simplement fixer la valeur du champ firstName
     
    // Et ensuite, j'aimerais faire des opérations classiques du type qx::dao::save() insert, ...
    avec Toto une table avec deux simples champs id et firstName, enregistrés dans le contexte QxOrm par le biais d'une classe Toto.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut


    Oui tu peux utiliser le moteur d'introspection de QxOrm pour récupérer la valeur d'une propriété d'une classe ou bien modifier cette valeur. Il faut juste que la classe ainsi que la propriété soient correctement enregistrées dans le contexte QxOrm (cf. fonction qx::register_class<T>()).
    Il y a une petite doc dans la FAQ pour expliquer le fonctionnement du moteur d'introspection de QxOrm :
    http://www.qxorm.com/qxorm_fr/faq.html#faq_190

    Donc ton code ressemblerait plutôt à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Récupère la propriété 'myProperty' de la classe 'myClass'
    qx::IxDataMember * pProperty = qx::QxClassX::getDataMember("myClass", "myProperty");
     
    // Récupère la valeur de type 'QString' pour l'instance 'myInstance'
    QString value = pProperty->getValue<QString>(myInstance); // 'myInstance' est un pointeur, sinon utiliser '& myInstance'
     
    // Modifie la valeur pour l'instance 'myInstance'
    QString newValue = "toto";
    bool bOk = pProperty->setValue(myInstance, newValue);
    Ensuite pour la sauvegarde, tu as 2 solutions :
    1- Ecrire une classe de base avec toutes les méthodes virtuelles : save, insert, update, delete, etc... Toutes tes classes doivent dériver de cette classe de base pour pouvoir intéragir avec la BDD. Cette méthode est plutôt "élégante" mais demande pas mal de code de ton côté.
    2- Ou bien, utiliser la notion de repository (merci à dodobibi au passage !) => l'objectif étant de proposer une interface commune pour les opérations de persistance (donc c'est exactement ce que tu veux). La contrainte est que tes classes persistantes doivent héritées du type 'QObject' (pas trop embêtant quand on bosse avec Qt ).

    Pour la solution 2, il y a un sujet qui parle de ça, tu pourras donc trouver des infos ici :
    http://www.developpez.net/forums/d11...introspection/
    Et de la documentation sur la classe ici :
    http://www.qxorm.com/doxygen/html/cl...epository.html

    En gros, le code pour sauvegarder ton objet serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    qx::IxRepository * pRepository = qx::QxRepositoryX::get("myClass");
    QSqlError err = pRepository->_save(myInstance); // 'myInstance' est un pointeur, sinon utiliser '& myInstance'
    Je te recommande la 2ème solution car tu auras beaucoup moins de code à écrire (juste faire dériver tes classes de QObject).
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Mais c'est beau !! Excellent !

    Bon, décidément, j'adore QxOrm ! Je gagne un temps fou !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Quand tu parles de 'myInstance', on est d'accord qu'il s'agit bien d'une instance de classe de mapping ? Je veux dire, celle qui correspond à ma table.

    Egalement, tu me dis qu'il faut qu'elle hérite de QObject, on parle bien de cette même classe ? Et au passage: pourquoi hériter de QObject ?

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Quand tu parles de 'myInstance', on est d'accord qu'il s'agit bien d'une instance de classe de mapping ? Je veux dire, celle qui correspond à ma table.
    Oui il faut que ce soit un pointeur (sinon utiliser & myInstance) vers une instance de classe enregistrée dans le contexte QxOrm.
    Remarque : ça peut être également une classe de base si tu veux accéder uniquement à des propriétés définies dans la classe de base.

    Egalement, tu me dis qu'il faut qu'elle hérite de QObject, on parle bien de cette même classe ?
    Oui, 'myInstance' doit avoir un type qui dérive de 'QObject' uniquement si tu veux utiliser les repository, sinon ce n'est pas nécessaire pour une utilisation normale de QxOrm.

    Et au passage: pourquoi hériter de QObject ?
    Oula, c'est une longue histoire. Tu auras la réponse dans le thread que je t'ai indiqué précédemment : http://www.developpez.net/forums/d11...introspection/.
    En gros, c'est le moyen le moins pire que j'ai trouvé pour pouvoir faire une vérification du type à l’exécution : avoir une classe de base (j'ai choisi QObject puisqu'on bosse avec Qt) permet de faire des dynamic_cast.
    En réalité, il y a un autre moyen si tu passes par des qx::QxCollection<> (car il y a la classe de base qx::IxCollection), mais c'est moins intuitif je trouve.
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.0] Créer une instance d'objet dynamique
    Par _jey_ dans le forum Langage
    Réponses: 1
    Dernier message: 07/06/2010, 17h45
  2. Créer une instance d'un objet COM
    Par vanitom dans le forum MFC
    Réponses: 5
    Dernier message: 25/10/2008, 15h28
  3. Réponses: 3
    Dernier message: 30/05/2008, 11h31
  4. Reflection : Créer une instance sans appeler le constructeur
    Par cboun94 dans le forum Framework .NET
    Réponses: 8
    Dernier message: 17/12/2007, 17h26
  5. [POO] Créer une instance d'un objet par la valeur d'une variable
    Par philworks dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 29/11/2007, 14h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo