Inserting classes derived from abstract classes

Forum for posting problems using QxOrm library

Inserting classes derived from abstract classes

Postby Guest » Thu Feb 16, 2012 10:48 am

Hi,

I have an abstract class Message and several derived messages (eg. TextMessage..). Now I have created a method

insertMessageIntoDB(Message *message)

which simply inserts any message (eg. TextMessage..) into the database. However, without an explicit dynamic cast the insert command fails.

QSqlError daoError = qx::dao::insert(*message);
if(daoError.isValid()) {
qWarning("Error inserting Message into db");
}

It works when I dynamically cast to the corresponding subclass, but this is quite tedious as I have to try all possible subclasses until the dynamic_cast is successful. Is there a simpler way to insert the object directly into the correct table of the database?
Guest
 

Re: Inserting classes derived from abstract classes

Postby QxOrm admin » Thu Feb 16, 2012 11:58 am

Hi,

without an explicit dynamic cast the insert command fails

For the next version of QxOrm library (1.2.3), I created a new interface and I think it will help you for your problem.
You can download a BETA version here :
http://www.qxorm.com/version/QxOrm_1.2.3_BETA_05.zip

Here is the new abstract class (or interface) - IxPersistable :
Code: Select all
/*!
 * \ingroup QxDao
 * \brief qx::IxPersistable : common interface (abstract class) for persistents classes using QX_PERSISTABLE_HPP() and QX_PERSISTABLE_CPP() macros
 *
 * To use this common interface for persistents classes :
 * <b>1-</b> inherit your persistent class from <i>qx::IxPersistable</i> ;
 * <b>2-</b> into your class definition (<i>myClass.h</i> for example), add <i>QX_PERSISTABLE_HPP(myClass)</i> macro ;
 * <b>3-</b> into your class implementation (<i>myClass.cpp</i> for example), add <i>QX_PERSISTABLE_CPP(myClass)</i> macro.
 *
 * <b>Note :</b> for a list of objects (<i>qxFetchAll()</i> method or <i>qxFetchByQuery()</i> method), use <i>qx::QxCollection<type_primary_key, boost::shared_ptr<my_type>></i> type.
 * Or just use <i>qx::IxPersistableCollection<T>::type</i> to retrieve your persistent collection type.
 */
class IxPersistable
{

public:

   virtual long qxCount(const qx::QxSqlQuery & query = qx::QxSqlQuery(), QSqlDatabase * pDatabase = NULL) = 0;
   virtual QSqlError qxFetchById(const QVariant & id = QVariant(), const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
   virtual QSqlError qxFetchAll(qx::IxCollection & list, const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
   virtual QSqlError qxFetchByQuery(const qx::QxSqlQuery & query, qx::IxCollection & list, const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
   virtual QSqlError qxInsert(const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
   virtual QSqlError qxUpdate(const qx::QxSqlQuery & query = qx::QxSqlQuery(), const QStringList & columns = QStringList(), const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
   virtual QSqlError qxSave(const QStringList & relation = QStringList(), QSqlDatabase * pDatabase = NULL) = 0;
   virtual QSqlError qxDeleteById(const QVariant & id = QVariant(), QSqlDatabase * pDatabase = NULL) = 0;
   virtual QSqlError qxDeleteAll(QSqlDatabase * pDatabase = NULL) = 0;
   virtual QSqlError qxDeleteByQuery(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL) = 0;
   virtual QSqlError qxDestroyById(const QVariant & id = QVariant(), QSqlDatabase * pDatabase = NULL) = 0;
   virtual QSqlError qxDestroyAll(QSqlDatabase * pDatabase = NULL) = 0;
   virtual QSqlError qxDestroyByQuery(const qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL) = 0;
   virtual qx_bool qxExist(const QVariant & id = QVariant(), QSqlDatabase * pDatabase = NULL) = 0;
   virtual qx::QxInvalidValueX qxValidate(const QStringList & groups = QStringList()) = 0;
   virtual boost::shared_ptr<qx::IxCollection> qxNewPersistableCollection() const = 0;

};


So your Message class must inherit from IxPersistable.
Then, use the macro QX_PERSISTABLE_HPP and QX_PERSISTABLE_CPP for each subclasses.
Then, you can write something like this :
Code: Select all
foreach(Message * message, lst)
{ daoError = message->qxInsert(); }
QxOrm admin
 


Return to QxOrm - Help

Who is online

Users browsing this forum: No registered users and 9 guests

cron