Separar o SQL do código
-
Em java temos frameworks de persistência que implicitamente separam o código SQL do código da aplicação.
Qt tem alguma coisa nesse sentido? -
Você diz algo no Java como Hibernate ou http://iciql.com/?
-
Se existisse um "hibernate" para Qt seria ótimo, mas meu interesse por enquanto se resumiria apenas a uma forma alegante de não deixar o código Qt misturado com SQL.
Em java eu usava os arquivos properties, neles ficavam todo o código SQL eu fazia um parser e capturava a query. -
Mas usar o mesmo mecanismo (properties -> hashtable) que você usa no java dá para fazer no Qt tranquilo usando o "QSettings":http://doc-snapshot.qt-project.org/qt5-5.4/qsettings.html
No caso do Hibertnate, tem o "QxORM":http://www.qxorm.com/qxorm_en/home.html.
-
Eu uso QSettings para as configurações do aplicativo. Apesar de saber que seria possivel usa-lo para isso não sei se seria lá muito elegante.
Pensei e usar JSON, acho que seria mais elegante.
O QxORM pareceu legal, mas vou deixa-lo para um futuro pois me parece que ele tem uma boa curva de estudo e com pouca documentação. -
Você pode usar o "QJsonDocument":http://doc.qt.io/qt-5/qjsondocument.html
usando o método "fromJson":http://doc.qt.io/qt-5/qjsondocument.html#fromJson ou "fromRawData":http://doc.qt.io/qt-5/qjsondocument.html#fromRawData.Depois do arquivo carregado, use o método "object()":http://doc.qt.io/qt-5/qjsondocument.html#object que retorna um "QJsonObject":http://doc.qt.io/qt-5/qjsonobject.html.
Mais ou menos assim (copiei lá do exemplo do Json Game)
@
bool Game::loadGame()
{
QFile loadFile(QStringLiteral("save.json"));if (!loadFile.open(QIODevice::ReadOnly)) { qWarning("Couldn't open save file."); return false; } QByteArray saveData = loadFile.readAll(); QJsonDocument loadDoc(QJsonDocument::fromJson(saveData)); readSettings(loadDoc.object()); return true;
}
@ -
Bom não sei se vai te ajudar mas eu utilizei o QSqlTableModel que faz toda a conversação com o banco de dados, e só me preocupo com as regras de negócio, fiz uma pequena lib para facilitar é claro, mas a idéia é a seguinte tenho o Model que herda de QSqlTableModel e tem as funções "CRUD" e ao instânciar o Model eu digo com qual Tabela no banco ele vai trabalhar e o Model carrega as informações com nome dos campos e tipos de dados da tabela no banco, tenho também um Record que herda de QSqlRecord ao qual são passadas as informações para que ele próprio crie os QSqlFields, e pronto só precisa se preocupar com as regras de negócio. Não consigo fazer joins mas meu banco de dados é pequeno, para dispositivos móveis e nem possuo as informações de relacionamento entre as tabelas uma vez que as tabelas chegam ao aparelho por sincronismo. Espero ter ajudado.