qt访问sqlite数据库封装
时间: 2023-11-15 14:03:25 浏览: 154
Qt提供了一个Qt SQL模块,用于访问各种数据库,包括SQLite数据库。在Qt中访问SQLite数据库可以进行简单的封装,具体的步骤如下:
1. 引入Qt SQL模块:在.pro文件或.pro.user文件中加入QT += sql。
2. 创建数据库连接:使用QSqlDatabase类创建一个数据库连接对象。
3. 打开数据库:使用QSqlDatabase的open()函数打开数据库连接,传入数据库的路径和名称。
4. 创建数据表:使用QSqlQuery类执行SQL语句来创建数据表以存储数据。例如,可以使用CREATE TABLE语句来创建表。
5. 插入数据:使用QSqlQuery类执行SQL语句来插入数据到表中。例如,可以使用INSERT INTO语句。
6. 查询数据:使用QSqlQuery类执行SQL语句来查询数据。例如,可以使用SELECT语句,并使用next()函数遍历结果。
7. 更新数据:使用QSqlQuery类执行SQL语句来更新数据。例如,可以使用UPDATE语句。
8. 删除数据:使用QSqlQuery类执行SQL语句来删除数据。例如,可以使用DELETE FROM语句。
9. 关闭数据库:使用QSqlDatabase的close()函数关闭数据库连接。
通过对Qt SQL模块的封装,可以方便地访问SQLite数据库。可以封装一个数据库管理类,将上述步骤封装成相应的函数或方法,以便在项目中进行数据库的操作。这样可以提高代码的可读性和复用性。
相关问题
qt操作sqlite类封装导入csv文件到sqlite数据库
以下是一个基于Qt操作SQLite数据库的封装类,可以实现将CSV文件导入到SQLite数据库中:
```cpp
#include <QtSql>
#include <QFile>
class SqliteHelper
{
public:
SqliteHelper(const QString& dbName)
{
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(dbName);
}
bool open()
{
if (!db.open()) {
return false;
}
return true;
}
bool execute(const QString& sql)
{
QSqlQuery query(db);
if (!query.exec(sql)) {
return false;
}
return true;
}
bool importCsv(const QString& tableName, const QString& csvFilePath)
{
QFile file(csvFilePath);
if (!file.open(QIODevice::ReadOnly)) {
return false;
}
QTextStream in(&file);
QStringList fields;
QString line = in.readLine();
fields = line.split(",");
QString createSql = "CREATE TABLE " + tableName + " (";
for (int i = 0; i < fields.count(); i++) {
createSql += fields.at(i) + " TEXT";
if (i != fields.count() - 1) {
createSql += ",";
}
}
createSql += ")";
if (!execute(createSql)) {
return false;
}
QSqlQuery query(db);
QString insertSql = "INSERT INTO " + tableName + " (";
for (int i = 0; i < fields.count(); i++) {
insertSql += fields.at(i);
if (i != fields.count() - 1) {
insertSql += ",";
}
}
insertSql += ") VALUES (";
for (int i = 0; i < fields.count(); i++) {
insertSql += "?";
if (i != fields.count() - 1) {
insertSql += ",";
}
}
insertSql += ")";
while (!in.atEnd()) {
line = in.readLine();
QStringList values = line.split(",");
query.prepare(insertSql);
for (int i = 0; i < values.count(); i++) {
query.addBindValue(values.at(i));
}
if (!query.exec()) {
return false;
}
}
return true;
}
private:
QSqlDatabase db;
};
```
使用该类的示例代码如下:
```cpp
SqliteHelper helper("test.db");
if (helper.open()) {
if (helper.importCsv("my_table", "my_data.csv")) {
qDebug() << "Import success!";
} else {
qDebug() << "Import failed!";
}
} else {
qDebug() << "Open database failed!";
}
```
其中,`test.db` 是数据库文件名,`my_table` 是将要创建的表名,`my_data.csv` 是CSV文件路径。
需要注意的是,上述代码中的CSV文件必须满足以下条件:
- 文件第一行为表格字段名;
- 文件中每行数据使用逗号分隔;
- 文件编码为UTF-8。
qt操作sqlite类封装导入csv文件到sqlite数据库,具有选择、过滤、固定、等类似excel的基本功能
可以通过以下步骤实现:
1. 在Qt中创建一个SQLite数据库,并创建一个表来存储CSV文件数据。
2. 使用Qt的文件对话框,让用户选择CSV文件。
3. 读取CSV文件数据,并将数据插入到SQLite数据库中的表中。
4. 添加过滤、固定列、排序等功能,可以使用Qt的QSortFilterProxyModel类来实现。
下面是一个示例代码,用于导入CSV文件到SQLite数据库中:
```cpp
#include <QtSql>
#include <QFileDialog>
#include <QTextStream>
class CsvFileModel : public QObject {
Q_OBJECT
public:
CsvFileModel(QObject *parent = nullptr) : QObject(parent) {}
bool importCsvFile(const QString &filePath, const QString &tableName, const QStringList &header) {
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly)) {
return false;
}
QSqlDatabase db = QSqlDatabase::database();
if (!db.isValid()) {
return false;
}
QSqlQuery query(db);
QString createTableSql = QString("CREATE TABLE %1 (%2)").arg(tableName).arg(header.join(", "));
if (!query.exec(createTableSql)) {
return false;
}
QTextStream in(&file);
while (!in.atEnd()) {
QString line = in.readLine();
QStringList values = line.split(",");
if (values.size() != header.size()) {
continue;
}
QString insertSql = QString("INSERT INTO %1 (%2) VALUES (%3)")
.arg(tableName)
.arg(header.join(", "))
.arg(values.join(", "));
if (!query.exec(insertSql)) {
return false;
}
}
return true;
}
};
class CsvTableModel : public QSqlTableModel {
Q_OBJECT
public:
CsvTableModel(QObject *parent = nullptr, QSqlDatabase db = QSqlDatabase()) : QSqlTableModel(parent, db) {}
QVariant data(const QModelIndex &idx, int role = Qt::DisplayRole) const override {
if (role == Qt::DisplayRole && idx.column() == 0) {
return QSqlTableModel::data(idx).toString().toUpper();
}
return QSqlTableModel::data(idx, role);
}
};
class CsvTableProxyModel : public QSortFilterProxyModel {
Q_OBJECT
public:
CsvTableProxyModel(QObject *parent = nullptr) : QSortFilterProxyModel(parent) {}
bool filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const override {
QString header = sourceModel()->headerData(source_column, Qt::Horizontal).toString();
if (header.startsWith("A")) {
return true;
}
return false;
}
bool lessThan(const QModelIndex &left, const QModelIndex &right) const override {
QString leftData = sourceModel()->data(left).toString();
QString rightData = sourceModel()->data(right).toString();
return leftData < rightData;
}
};
void importCsvFileToSqlite() {
QString filePath = QFileDialog::getOpenFileName(nullptr, "Open CSV file", ".", "CSV files (*.csv)");
if (filePath.isEmpty()) {
return;
}
CsvFileModel csvFile;
QStringList header = {"Name", "Age", "Gender"};
if (!csvFile.importCsvFile(filePath, "people_info", header)) {
qDebug() << "Failed to import CSV file to SQLite database!";
return;
}
QSqlDatabase db = QSqlDatabase::database();
if (!db.isValid()) {
return;
}
CsvTableModel *tableModel = new CsvTableModel(nullptr, db);
tableModel->setTable("people_info");
tableModel->select();
CsvTableProxyModel *proxyModel = new CsvTableProxyModel(nullptr);
proxyModel->setSourceModel(tableModel);
QTableView *tableView = new QTableView(nullptr);
tableView->setModel(proxyModel);
tableView->setSortingEnabled(true);
tableView->show();
}
```
在上面的代码中,CsvFileModel类用于导入CSV文件到SQLite数据库中。CsvTableModel继承自QSqlTableModel,用于显示SQLite数据库中的数据。CsvTableProxyModel继承自QSortFilterProxyModel,用于添加过滤、固定列、排序等功能。在importCsvFileToSqlite函数中,首先让用户选择CSV文件,然后调用CsvFileModel的importCsvFile函数将数据导入到SQLite数据库中。最后创建一个QTableView来显示SQLite数据库中的数据,并使用CsvTableProxyModel来添加过滤、固定列、排序等功能。
阅读全文