Qt SqliteHelper , QSqlDatabase和QSqlQuery实现

看到一篇关于Qt使用Sqlite的教程贴, 稍微改了下封装起来

原帖地址:    https://www.cnblogs.com/xia-weiwen/archive/2017/05/04/6806709.html



遇到一个头疼的bug, 调试了一个上午

//bug 需要在方法中重新定义, 不然会出现 "Driver not loaded" 的错误

QSqlQuery sql_query;

这个对象要在类成员函数中定义,不能在头文件声明,不然会出现找不到驱动的错误


我也不知道为什么



开始贴代码

文件目录


main.cpp

#include <QtCore/QCoreApplication>
#include "sqlitehelper.h"
#include <QDebug>
#include <QStringList>
 
 
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
void dbTest();
void dbTest1();
 
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    dbTest();
 
 
 
 
 
 
    return a.exec();
}
 
 
void dbTest()
{
    // 枚举可用驱动
    qDebug() << QSqlDatabase::drivers();
 
 
    SqliteHelper sqliteHelper;
    sqliteHelper.createDatabase();
    sqliteHelper.open();
 
 
    int ID;
    ID = sqliteHelper.getMaxId();
    QString cmd;
    cmd = QString("INSERT INTO Log VALUES(%1, 0, '2018/5/24', '', '')").arg(ID + 1);
    qDebug() << cmd;
    sqliteHelper.insert(cmd);
 
 
    sqliteHelper.close();
}
 
 

sqliteHelper.h

#ifndef SQLITEHELPER_H
#define SQLITEHELPER_H
 
 
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
 
 
class SqliteHelper
{
public:
    SqliteHelper();
 
 
    void createDatabase();
    void createDataTable();
    void open();
    void close();
 
 
    int insert(QString cmd);
    void update();
    void query();
    void deleteRecord();
 
 
 
 
    int getMaxId();
 
 
private:
    QSqlDatabase database;
    QSqlQuery sql_query; //bug 需要在方法中重新定义, 不然会出现 "Driver not loaded" 的错误
    int max_id;
};
 
 
#endif // SQLITEHELPER_H
 
 

sqliteHelper.cpp

 #include "sqlitehelper.h"
#include <QDebug>
#include <QStringList>
 
 
SqliteHelper::SqliteHelper()
{
    max_id = 0;
}
 
 
void SqliteHelper::createDatabase()
{
    // create database
    if (QSqlDatabase::contains("qt_sql_default_connection"))
    {
        database = QSqlDatabase::database("qt_sql_default_connection");
    }
    else
    {
        database = QSqlDatabase::addDatabase("QSQLITE");
        database.setDatabaseName("log.sqlite");
//        database.setUserName("");
//        database.setPassword("");
    }
}
 
 
void SqliteHelper::createDataTable()
{
    QString create_sql = "create table Log (ID int primary key, Type int, Time varchar(32), Content varchar(32), Note varchar(128))";
    sql_query.prepare(create_sql);
    if(!sql_query.exec())
    {
        qDebug() << "Error: Fail to create table." << sql_query.lastError();
    }
    else
    {
        qDebug() << "Table created!";
    }
}
 
 
void SqliteHelper::open()
{
    if (!database.open())
    {
        qDebug() << "Error: Failed to connect database." << database.lastError();
    }
    else
    {
        qDebug() << "Open database successfully." ;
        // do something
    }
}
 
 
void SqliteHelper::close()
{
    database.close();
}
 
 
int SqliteHelper::insert(QString cmd)
{
//    QString insert_sql = "insert into Log values (?, ?, ?)";
//    sql_query.prepare(insert_sql);
//    sql_query.addBindValue(max_id+1);
//    sql_query.addBindValue("Wang");
//    sql_query.addBindValue(25);
//    if(!sql_query.exec())
//    {
//        qDebug() << sql_query.lastError();
//    }
//    else
//    {
//        qDebug() << "inserted Wang!";
//    }
    QSqlQuery sql_query;
    if(!sql_query.exec(cmd))
    {
        qDebug() << sql_query.lastError();
        return 0;
    }
    else
    {
        qDebug() << "inserted successfully.";
        return 1;
    }
}
 
 
int SqliteHelper::getMaxId()
{
    QSqlQuery sql_query;
    QString select_max_sql = "select max(ID) from Log";
 
 
    sql_query.prepare(select_max_sql);
    if(!sql_query.exec())
    {
        qDebug() << sql_query.lastError();
    }
    else
    {
        while(sql_query.next())
        {
            max_id = sql_query.value(0).toInt();
            qDebug() << QString("max id:%1").arg(max_id);
            return max_id;
        }
    }
}
 
 

文档文件

这里有个问题是相对路径

log.sqlite

在调试时会默认根目录(即release的上层目录)为当前目录

在Release中运行exe默认根目录则是在Release里

同样, Debug也是


数据库插入建表和插入数据后


字段类型


猜你喜欢

转载自blog.csdn.net/empty_android/article/details/80438497
今日推荐