SQLite的使用
摘要:主要是了解Qt中创建SQLite数据库的基本流程,使用QSqlQuery类和SQL基本语法实现创建简单数据库并添加数据。下一篇会介绍与Model/View配合更默契的QSqlTableModel和QSqlRelationalTableModel,这些高层接口将不依赖SQL语法实现数据库操作。
一、创建数据库
新建Qt工程,添加空的C++类文件(本文暂不使用ui)。在.pro文件中添加
QT += sql
这里默认创建的是SQLite,Qt默认搭载QSqlite驱动(包含了Sqlite数据库),所以这里不必使用
QSqlDatabase::drivers()
去查找系统中可用数据库驱动了。
新建方法bool ConnectDB(const QString &dbName),用于创建并配置一个数据库连接。
@sqliteconnection.cpp
bool SqlConnection::ConnectDB(const QString &dbName) {
QSqlDatabase myDB = QSqlDatabase::addDatabase("QSQLITE");
// myDB.setHostName("host");
// myDB.setDatabaseName("dbname");
// myDB.setUserName("username");
// myDB.setPassword("password");
myDB.setDatabaseName(dbName);
if (!myDB.open()) {
QMessageBox::critical(0,QObject::tr("Database Error"),myDB.lastError().text());
qDebug()<<"my_db open error !";
return false;
}
return true;
}
setDatabaseName()用于设置要连接的数据库名,同名链接新的会覆盖旧的。如果搭建数据库服务器,注释中可以对主机名、用户名等进行配置。open()用于打开数据库链接并返回bool值。lastError()用于输出最新错误。在main()中调用它:
@main.cpp
#include "mainwindow.h"
#include "sqlconnection.h"
#include <QApplication>
#include <QFile>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFile file("demo.db");
if (file.exists())
file.remove();//用于测试时删除上一次创建的数据库
SqlConnection sql;
sql.ConnectDB("demo.db")//建立名为"demo.db"的数据库连接
// MainWindow w;
// w.show();
return a.exec();
}
此时已经可以创建一个数据库链接,在build-debug文件路径下可以看到demo.db文件。
二、添加数据库查询
要实现数据库查询,需要将QSqlQuery实例化。
@sqlconnection.cpp
bool SqlConnection::CreateDB() {
QSqlQuery query;
if (!query.exec("CREATE TABLE music ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"title VARCHAR,"
"artist VARCHAR)"))
{
QMessageBox::critical(0,QObject::tr("Database Error"),query.lastError().text());
return 1;
}
return true;
}
这里创建了一个数据库表music,包含title和artist两个属性,关键字”id”自动递增。
三、插入数据
@sqlconnection.cpp
bool SqlConnection::AddData() {
QSqlQuery query;
query.prepare("INSERT INTO music (title, artist) VALUES (?,?)");
QStringList titles;
titles <<QString::fromLocal8Bit("小城故事")<< QString::fromLocal8Bit("她") << "Dapartures";
query.addBindValue(titles);
QVariantList artists;
artists<< QString::fromLocal8Bit("邓丽君") << QString::fromLocal8Bit("朱婧汐") << "EGOIST";
query.addBindValue(artists);
if (!query.execBatch()) {
QMessageBox::critical(0,QObject::tr("Database Error"),query.lastError().text());
}
query.finish();
query.exec("SELECT title, artist FROM music");
while (query.next()) {
QString title = query.value(0).toByteArray();
QString artist = query.value(1).toByteArray();
qDebug()<<title<<"|"<<artist;
}
return true;
}
@main.cpp
#include "mainwindow.h"
#include "sqlconnection.h"
#include <QApplication>
#include <QFile>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFile file("demo.db");
if (file.exists())
file.remove();
SqlConnection sql;
if (sql.ConnectDB("demo.db")) {
sql.CreateDB();
sql.AddData();
}
// MainWindow w;
// w.show();
return a.exec();
}
运行结果:
三、中文问题
Sqlite默认是不支持中文的(截止目前版本为SQLite version 3.20.1),网上看了一圈方法很多,但是有的写的也很复杂。我这里给出一种能简便地实现中文输入的方法:
1、将包含中文的文件(.cpp、.h)用记事本打开,随便加个空格什么的修改一下,保存。
2、在使用中文的地方用QString::fromLocal8Bit(“中文”) 。
就可以实现将中文字符插入数据库了。