Criando-um-metodo-que-recebe-um-objeto-qualquer-e-faz-uma-insercaeo-em-uma-tabela-de-um-banco-de-dad: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
Como prometi no topico | Como prometi no topico "Como Manipular uma Classe Qualquer?":http://forum.qt.io/viewthread/26452/, vou mostrar agora como fazer um metodo que recebe uma classe qualquer. | ||
O objetivo em questao é receber um objeto qualquer e fazer um | O objetivo em questao é receber um objeto qualquer e fazer um "insert" em um banco de dados (no caso usei o sqlite) a partir das propriedades do objeto. | ||
segue o código: | segue o código: | ||
meu objeto | meu objeto "C1&quot;<br /><code><br />#ifndef C1_H<br />#define C1_H | ||
#include <QObject&gt;<br />#include <QtScript/QScriptClass&gt; | |||
class C1 : public QObject<br />{<br /> Q_OBJECT | |||
arquivo de codigo do meu | //aqui definiremos as propriedades do objeto e seus respectivos metodos de leitura, onde:<br />// Q_PROPERTY(<tipo e nome da propriedade&gt; READ <nome funçao que retorna o valor da sua propriedade&gt;)<br />// o "READ&quot; serve para especificar qual a funçao que retornara o valor da minha propriedade<br /> Q_PROPERTY(int x READ X)<br /> Q_PROPERTY(QString campo1 READ Campo1)<br /> Q_PROPERTY(int campo2 READ Campo2)<br /> Q_PROPERTY(QString parameters READ parameters) | ||
public:<br /> explicit C1(QObject *parent = 0); | |||
QString parameters()<br /> {<br />//aqui eu posso retornar os parametros a seguir:<br /> return "table(c1);colums(campo1,campo2,x)";<br />//ou nada, indicando que todas as propriedades serao inseridas na tabela<br /> //return "";<br /> } | |||
QString Campo1();//const;<br /> int Campo2();<br /> int X(); | |||
private:<br /> int x;<br />}; | |||
#endif // C1_H<br /></code> | |||
arquivo cpp do meu objeto:<br /><code><br />#include "c1.h&quot; | |||
C1::C1(QObject *parent) :<br /> QObject(parent)<br />{<br /> x=20; | |||
//aqui, se preferirem indiquem o um nome para o objeto…<br />// no caso, estou usando ele para referenciar o nome da tabela<br />//se nao for informado o nome da tabela sera o mesmo da minha classe…<br /> // this->setObjectName("C1&quot;);<br />} | |||
QString C1::Campo1()<br />{<br /> return "Rodrigo&quot;;<br />} | |||
int C1::Campo2()<br />{<br /> return 3;<br />} | |||
int C1::X()<br />{<br /> return this->x;<br />}<br /></code> | |||
minha classe "ConnectionDB&quot;:<br /><code><br />#ifndef CONNECTIODB_H<br />#define CONNECTIODB_H | |||
#include <QObject&gt;<br />#include <qsql.h&gt; | |||
class ConnectioDB : public QObject<br />{<br /> Q_OBJECT<br />public:<br /> explicit ConnectioDB(QObject *parent = 0); | |||
//o metodo a seguir é responsavel por abrir uma conexao com o meu banco de dados<br /> static bool createConnection(QString plugin, bool memory ,QString connectionName,<br /> QString DBname,QString Hostname, QString user, QString pass); | |||
static bool insert(QObject *obj,QString connectionName);<br />// static bool update(QObject *obj,QString connectionName);<br />// static bool remove(QObject *obj,QString connectionName); | |||
signals: | |||
public slots: | |||
}; | |||
#endif // CONNECTIODB_H<br /></code> | |||
arquivo de codigo do meu "ConnectionDB&quot; | |||
<code><br />#include "connectiodb.h&quot;<br />#include <QMessageBox&gt;<br />#include <QSqlDatabase&gt;<br />#include <QSqlError&gt;<br />#include <QSqlQuery&gt;<br />#include "QString&quot;<br />#include "QDebug&quot;<br />#include "QtGui&quot;<br />#include "QMetaObject&quot;<br />#include <QVariant&gt; | |||
ConnectioDB::ConnectioDB(QObject '''parent) :<br /> QObject(parent)<br />{ | |||
<br />} | |||
<br />bool ConnectioDB::createConnection(QString plugin, bool memory, QString connectionName, QString DBname, QString Hostname, QString user, QString pass)<br />{<br /> /'''<br /> Essa funçao abrira uma conexão, se for passado as seguintes informações: | |||
plugin* - É informado o plugin referente ao banco de dados que sera feito a conexão. | |||
local* - Apenas para o QSQLITE onde pode assumir os valores "memory&quot; ou "null&quot; | |||
connectionname* - Nome da conexão que sera criada | |||
Hostname - Local onde esta o servidor. Desnecessario quando o plugin for o QSQLITE | |||
user - Usuário, necessario quando a conexao requer autenticaçao. | |||
pass - Senha, necessario quando a conexao requer autenticaçao. | |||
OBS: os parametros descritos com o simbolo * indica que o parametro é obrigatorio. Demais<br /> pode ser informado o valor null para indicar que nao sera usado. | |||
'''falta descrever alguns parametros…. | |||
<br />'''/<br /> QSqlDatabase db = QSqlDatabase::addDatabase(plugin, connectionName);<br /> if(!memory)<br /> {<br /> if(!Hostname.isEmpty())<br /> db.setHostName(Hostname);<br /> if(!user.isEmpty())<br /> db.setUserName(user);<br /> if(!pass.isEmpty())<br /> db.setPassword(pass);<br /> if(!DBname.isEmpty())<br /> db.setDatabaseName(DBname);<br /> }<br /> else db.setDatabaseName(":memory:"); | |||
if (!db.open())<br /> {<br /> QMessageBox::critical(0, qApp->tr("Cannot open database&quot;),<br /> qApp->tr("Unable to establish a database connection."<br /> "This example needs SQLite support. Please read "<br /> "the Qt SQL driver documentation for information how "<br /> "to build it."<br /> "Click Cancel to exit."), QMessageBox::Cancel);<br /> qDebug()<<"Create Connection&quot;<<connectionName&lt;<false&lt;<"- DATA BASE:"<<DBname;<br /> return false;<br /> } | |||
qDebug()<<"Create Connection&quot;<<connectionName&lt;<true&lt;<"- DATA BASE:"<<DBname;<br /> return true;<br />} | |||
bool ConnectioDB::insert(QObject '''obj, QString connectionName)<br />{ | |||
<br /> const QMetaObject''' metaObject = obj->metaObject();<br /> QString colums="";<br /> QString table=obj->objectName();//estou usando o nome do objeto para referenciar o nome da tabela<br /> QString values="";<br /> //processa os parametros | |||
//pega a propriedade que possui o nome "parameters&quot;<br /> // QVariant v = obj->property(metaObject->property(metaObject->indexOfProperty("parameters&quot;)).name());<br /> QVariant v = obj->property("parameters&quot;);//retorna um valor a partir do nome da propriedade | |||
//leitura dos parametros<br /> QString parameters=v.toString();<br /> //separa e joga em uma lista<br /> QStringList list=parameters.split(";"); | |||
for (int i = 0; i < list.size(); +''i)<br /> {<br /> QString str=list.at(i).toLocal8Bit().constData();<br /> if(str.contains("colums&quot;))<br /> {<br /> // str.remove("colums(");<br /> str.remove("colums&quot;);<br /> // str.remove(")");<br /> colums=str;<br /> qDebug()<<"colums="&lt;&lt;colums;<br /> }else if(str.contains("table&quot;))<br /> {<br /> str.remove("table(");<br /> str.remove(")");<br /> table=str;<br /> qDebug()<<"table="&lt;&lt;table;<br /> }<br /> } | |||
<br /> //reunindo os valores a serem inseridos<br /> if(colums.isEmpty())<br /> {<br /> for(int i = metaObject-&gt;propertyOffset(); i &lt; metaObject-&gt;propertyCount();i)<br /> { | |||
<br /> QVariant v = obj-&gt;property(metaObject-&gt;property(i).name());<br /> if(!QString(metaObject-&gt;property(i).name()).contains("parameters&quot;,Qt::CaseInsensitive))//remove "parameters&quot; da inserçao<br /> {<br /> if(!colums.isEmpty())<br /> colums''=",";<br /> colums+=QString::fromLatin1(metaObject->property(i).name()).toLower(); | |||
if(colums.contains(QString::fromLatin1(metaObject->property(i).name()).toLower()))<br /> {<br /> if(!values.isEmpty()) values+=",";<br /> values+="'"''v.toString()''"'";<br /> }<br /> }<br /> }<br /> colums="("''colums''")";<br /> } else<br /> {<br /> QString aux=colums;<br /> aux.remove("(");<br /> aux.remove(")");<br /> QStringList columsList=aux.split(","); | |||
for (int i = 0; i < columsList.size(); +''i)<br /> { | |||
<br /> // QVariant v2 = obj->property(metaObject->property(metaObject->indexOfProperty(QString(columsList.at(i).toLocal8Bit()).toAscii())).name());<br />QVariant v2 = obj->property(QString(columsList.at(i).toLocal8Bit()).toAscii());<br /> if(!values.isEmpty()) values''=",";<br /> values+="'"''v2.toString()''"'";<br /> }<br /> } | |||
//faz a inserçao no banco de dados<br /> QSqlQuery *query=new QSqlQuery(connectionName,QSqlDatabase::database(connectionName));<br /> qDebug() <<"values ="<<values&lt;<"colums ="<<colums&lt;<query->exec&amp;#40;"INSERT INTO "''table+colums''"VALUES (&quot;+values+&quot;&amp;#41;;&quot;);<br />}<br /></code> | |||
meu arquivo main: | meu arquivo main: | ||
<code><br />#include "mainwindow.h&quot;<br />#include <QApplication&gt;<br />#include <QDebug&gt;<br />#include <c1.h&gt;<br />#include <connectiodb.h&gt;<br />#include <QSqlQuery&gt; | |||
int main(int argc, char *argv[])<br />{<br /> C1 *c1 = new C1;<br /> ConnectioDB::createConnection("QSQLITE&quot;,false,"meubd&quot;,"teste.db&quot;,NULL,NULL,NULL);<br /> QSqlQuery *query=new QSqlQuery("meubd&quot;,QSqlDatabase::database("meubd&quot;));<br />// qDebug() <<query->exec&amp;#40;"CREATE TABLE C1 ( "<br />// "cod INTEGER PRIMARY KEY&quot;<br />// "NOT NULL, "<br />// "campo1 VARCHAR( 128 &#41;, "<br />// "campo2 INT, "<br />// "x INT "<br />// ");");<br /> c1->setObjectName("c1&quot;);<br /> ConnectioDB::insert(c1,"meubd&quot;);<br /> return 0;<br />}<br /></code> | |||
é isso, próximo post vou mostrar como escrever em um objeto qualquer fazendo um metodo que busca um objeto em uma tabela. | é isso, próximo post vou mostrar como escrever em um objeto qualquer fazendo um metodo que busca um objeto em uma tabela. | ||
Revision as of 11:02, 24 February 2015
Como prometi no topico "Como Manipular uma Classe Qualquer?":http://forum.qt.io/viewthread/26452/, vou mostrar agora como fazer um metodo que recebe uma classe qualquer.
O objetivo em questao é receber um objeto qualquer e fazer um "insert" em um banco de dados (no caso usei o sqlite) a partir das propriedades do objeto.
segue o código:
meu objeto "C1"
<br />#ifndef C1_H<br />#define C1_H
#include <QObject&gt;<br />#include <QtScript/QScriptClass&gt;
class C1 : public QObject<br />{<br /> Q_OBJECT
//aqui definiremos as propriedades do objeto e seus respectivos metodos de leitura, onde:<br />// Q_PROPERTY(<tipo e nome da propriedade&gt; READ <nome funçao que retorna o valor da sua propriedade&gt;)<br />// o "READ&quot; serve para especificar qual a funçao que retornara o valor da minha propriedade<br /> Q_PROPERTY(int x READ X)<br /> Q_PROPERTY(QString campo1 READ Campo1)<br /> Q_PROPERTY(int campo2 READ Campo2)<br /> Q_PROPERTY(QString parameters READ parameters)
public:<br /> explicit C1(QObject *parent = 0);
QString parameters()<br /> {<br />//aqui eu posso retornar os parametros a seguir:<br /> return "table(c1);colums(campo1,campo2,x)";<br />//ou nada, indicando que todas as propriedades serao inseridas na tabela<br /> //return "";<br /> }
QString Campo1();//const;<br /> int Campo2();<br /> int X();
private:<br /> int x;<br />};
#endif // C1_H<br />
arquivo cpp do meu objeto:
<br />#include "c1.h&quot;
C1::C1(QObject *parent) :<br /> QObject(parent)<br />{<br /> x=20;
//aqui, se preferirem indiquem o um nome para o objeto…<br />// no caso, estou usando ele para referenciar o nome da tabela<br />//se nao for informado o nome da tabela sera o mesmo da minha classe…<br /> // this->setObjectName("C1&quot;);<br />}
QString C1::Campo1()<br />{<br /> return "Rodrigo&quot;;<br />}
int C1::Campo2()<br />{<br /> return 3;<br />}
int C1::X()<br />{<br /> return this->x;<br />}<br />
minha classe "ConnectionDB":
<br />#ifndef CONNECTIODB_H<br />#define CONNECTIODB_H
#include <QObject&gt;<br />#include <qsql.h&gt;
class ConnectioDB : public QObject<br />{<br /> Q_OBJECT<br />public:<br /> explicit ConnectioDB(QObject *parent = 0);
//o metodo a seguir é responsavel por abrir uma conexao com o meu banco de dados<br /> static bool createConnection(QString plugin, bool memory ,QString connectionName,<br /> QString DBname,QString Hostname, QString user, QString pass);
static bool insert(QObject *obj,QString connectionName);<br />// static bool update(QObject *obj,QString connectionName);<br />// static bool remove(QObject *obj,QString connectionName);
signals:
public slots:
};
#endif // CONNECTIODB_H<br />
arquivo de codigo do meu "ConnectionDB"
<br />#include "connectiodb.h&quot;<br />#include <QMessageBox&gt;<br />#include <QSqlDatabase&gt;<br />#include <QSqlError&gt;<br />#include <QSqlQuery&gt;<br />#include "QString&quot;<br />#include "QDebug&quot;<br />#include "QtGui&quot;<br />#include "QMetaObject&quot;<br />#include <QVariant&gt;
ConnectioDB::ConnectioDB(QObject '''parent) :<br /> QObject(parent)<br />{
<br />}
<br />bool ConnectioDB::createConnection(QString plugin, bool memory, QString connectionName, QString DBname, QString Hostname, QString user, QString pass)<br />{<br /> /'''<br /> Essa funçao abrira uma conexão, se for passado as seguintes informações:
plugin* - É informado o plugin referente ao banco de dados que sera feito a conexão.
local* - Apenas para o QSQLITE onde pode assumir os valores "memory&quot; ou "null&quot;
connectionname* - Nome da conexão que sera criada
Hostname - Local onde esta o servidor. Desnecessario quando o plugin for o QSQLITE
user - Usuário, necessario quando a conexao requer autenticaçao.
pass - Senha, necessario quando a conexao requer autenticaçao.
OBS: os parametros descritos com o simbolo * indica que o parametro é obrigatorio. Demais<br /> pode ser informado o valor null para indicar que nao sera usado.
'''falta descrever alguns parametros….
<br />'''/<br /> QSqlDatabase db = QSqlDatabase::addDatabase(plugin, connectionName);<br /> if(!memory)<br /> {<br /> if(!Hostname.isEmpty())<br /> db.setHostName(Hostname);<br /> if(!user.isEmpty())<br /> db.setUserName(user);<br /> if(!pass.isEmpty())<br /> db.setPassword(pass);<br /> if(!DBname.isEmpty())<br /> db.setDatabaseName(DBname);<br /> }<br /> else db.setDatabaseName(":memory:");
if (!db.open())<br /> {<br /> QMessageBox::critical(0, qApp->tr("Cannot open database&quot;),<br /> qApp->tr("Unable to establish a database connection."<br /> "This example needs SQLite support. Please read "<br /> "the Qt SQL driver documentation for information how "<br /> "to build it."<br /> "Click Cancel to exit."), QMessageBox::Cancel);<br /> qDebug()<<"Create Connection&quot;<<connectionName&lt;<false&lt;<"- DATA BASE:"<<DBname;<br /> return false;<br /> }
qDebug()<<"Create Connection&quot;<<connectionName&lt;<true&lt;<"- DATA BASE:"<<DBname;<br /> return true;<br />}
bool ConnectioDB::insert(QObject '''obj, QString connectionName)<br />{
<br /> const QMetaObject''' metaObject = obj->metaObject();<br /> QString colums="";<br /> QString table=obj->objectName();//estou usando o nome do objeto para referenciar o nome da tabela<br /> QString values="";<br /> //processa os parametros
//pega a propriedade que possui o nome "parameters&quot;<br /> // QVariant v = obj->property(metaObject->property(metaObject->indexOfProperty("parameters&quot;)).name());<br /> QVariant v = obj->property("parameters&quot;);//retorna um valor a partir do nome da propriedade
//leitura dos parametros<br /> QString parameters=v.toString();<br /> //separa e joga em uma lista<br /> QStringList list=parameters.split(";");
for (int i = 0; i < list.size(); +''i)<br /> {<br /> QString str=list.at(i).toLocal8Bit().constData();<br /> if(str.contains("colums&quot;))<br /> {<br /> // str.remove("colums(");<br /> str.remove("colums&quot;);<br /> // str.remove(")");<br /> colums=str;<br /> qDebug()<<"colums="&lt;&lt;colums;<br /> }else if(str.contains("table&quot;))<br /> {<br /> str.remove("table(");<br /> str.remove(")");<br /> table=str;<br /> qDebug()<<"table="&lt;&lt;table;<br /> }<br /> }
<br /> //reunindo os valores a serem inseridos<br /> if(colums.isEmpty())<br /> {<br /> for(int i = metaObject-&gt;propertyOffset(); i &lt; metaObject-&gt;propertyCount();i)<br /> {
<br /> QVariant v = obj-&gt;property(metaObject-&gt;property(i).name());<br /> if(!QString(metaObject-&gt;property(i).name()).contains("parameters&quot;,Qt::CaseInsensitive))//remove "parameters&quot; da inserçao<br /> {<br /> if(!colums.isEmpty())<br /> colums''=",";<br /> colums+=QString::fromLatin1(metaObject->property(i).name()).toLower();
if(colums.contains(QString::fromLatin1(metaObject->property(i).name()).toLower()))<br /> {<br /> if(!values.isEmpty()) values+=",";<br /> values+="'"''v.toString()''"'";<br /> }<br /> }<br /> }<br /> colums="("''colums''")";<br /> } else<br /> {<br /> QString aux=colums;<br /> aux.remove("(");<br /> aux.remove(")");<br /> QStringList columsList=aux.split(",");
for (int i = 0; i < columsList.size(); +''i)<br /> {
<br /> // QVariant v2 = obj->property(metaObject->property(metaObject->indexOfProperty(QString(columsList.at(i).toLocal8Bit()).toAscii())).name());<br />QVariant v2 = obj->property(QString(columsList.at(i).toLocal8Bit()).toAscii());<br /> if(!values.isEmpty()) values''=",";<br /> values+="'"''v2.toString()''"'";<br /> }<br /> }
//faz a inserçao no banco de dados<br /> QSqlQuery *query=new QSqlQuery(connectionName,QSqlDatabase::database(connectionName));<br /> qDebug() <<"values ="<<values&lt;<"colums ="<<colums&lt;<query->exec&amp;#40;"INSERT INTO "''table+colums''"VALUES (&quot;+values+&quot;&amp;#41;;&quot;);<br />}<br />
meu arquivo main:
<br />#include "mainwindow.h&quot;<br />#include <QApplication&gt;<br />#include <QDebug&gt;<br />#include <c1.h&gt;<br />#include <connectiodb.h&gt;<br />#include <QSqlQuery&gt;
int main(int argc, char *argv[])<br />{<br /> C1 *c1 = new C1;<br /> ConnectioDB::createConnection("QSQLITE&quot;,false,"meubd&quot;,"teste.db&quot;,NULL,NULL,NULL);<br /> QSqlQuery *query=new QSqlQuery("meubd&quot;,QSqlDatabase::database("meubd&quot;));<br />// qDebug() <<query->exec&amp;#40;"CREATE TABLE C1 ( "<br />// "cod INTEGER PRIMARY KEY&quot;<br />// "NOT NULL, "<br />// "campo1 VARCHAR( 128 &#41;, "<br />// "campo2 INT, "<br />// "x INT "<br />// ");");<br /> c1->setObjectName("c1&quot;);<br /> ConnectioDB::insert(c1,"meubd&quot;);<br /> return 0;<br />}<br />
é isso, próximo post vou mostrar como escrever em um objeto qualquer fazendo um metodo que busca um objeto em uma tabela.