在线程中执行数据库的增删改查等操作(Qt)

#ifndef MYSQLTHREAD_H
#define MYSQLTHREAD_H

#include <QThread>
#include <QObject>
#include <QtSql>
#include <QDebug>
#include <functional>

class MySQLThread : public QThread
{
    Q_OBJECT

public:
    explicit MySQLThread(QObject *parent = nullptr);
    ~MySQLThread();

    // 连接数据库
    void connectToDatabase(QString hostname, QString databaseName, QString username, QString password);

    // 断开数据库连接
    void disconnectFromDatabase();

signals:
    // 数据操作完成信号,参数为操作是否成功和操作类型
    void dataOperationFinished(bool success, const QString &operation);

    // 查询数据完成信号,参数为查询结果列表
    void dataQueried(const QList<QMap<QString, QVariant>> &result);

public slots:
    // 插入数据到指定表
    void insertData(const QString &tableName, const QMap<QString, QVariant> &data);

    // 删除指定表中符合条件的数据
    void deleteData(const QString &tableName, const QString &condition);

    // 更新指定表中符合条件的数据
    void updateData(const QString &tableName, const QMap<QString, QVariant> &data, const QString &condition);

    // 查询指定表中符合条件的数据
    void queryData(const QString &tableName, const QString &condition);

protected:
    void run() override;

private:
    QSqlDatabase db; // 数据库连接对象

    // 创建数据库连接
    bool createConnection(const QString &hostname, const QString &databaseName, const QString &username, const QString &password);
};

#endif // MYSQLTHREAD_H

#include "MySQLThread.h"

MySQLThread::MySQLThread(QObject *parent) : QThread(parent)
{

}

MySQLThread::~MySQLThread()
{
    disconnectFromDatabase();
}

void MySQLThread::connectToDatabase(QString hostname, QString databaseName, QString username, QString password)
{
    if (db.isOpen()) {
        qDebug() << "数据库已经打开。";
        return;
    }

    if (!createConnection(hostname, databaseName, username, password)) {
        qDebug() << "连接数据库失败。";
        return;
    }

    qDebug() << "数据库连接成功。";
}

void MySQLThread::disconnectFromDatabase()
{
    if (db.isOpen()) {
        db.close();
        qDebug() << "数据库已关闭。";
    }
}

void MySQLThread::run()
{
    exec(); // 进入线程事件循环
}

void MySQLThread::insertData(const QString &tableName, const QMap<QString, QVariant> &data)
{
    performDatabaseOperation([=]() {
        QSqlQuery query(db);

        QString columns;
        QString values;

        // 构建插入语句的列和值部分
        for (auto it = data.constBegin(); it != data.constEnd(); ++it) {
            columns += it.key() + ", ";
            values += ":" + it.key() + ", ";
            query.bindValue(":" + it.key(), it.value());
        }

        columns.chop(2); // 移除末尾的 ", "
        values.chop(2);  // 移除末尾的 ", "

        // 构建完整的插入语句
        QString queryString = QString("INSERT INTO %1 (%2) VALUES (%3)").arg(tableName, columns, values);

        // 执行插入操作
        bool success = query.exec(queryString);
        emit dataOperationFinished(success, "Insert");

        if (success) {
            qDebug() << "数据插入成功。";
        } else {
            qDebug() << "数据插入失败:" << query.lastError().text();
        }
    });
}

void MySQLThread::deleteData(const QString &tableName, const QString &condition)
{
    performDatabaseOperation([=]() {
        QSqlQuery query(db);

        // 构建删除语句
        QString queryString = QString("DELETE FROM %1 WHERE %2").arg(tableName, condition);

        // 执行删除操作
        bool success = query.exec(queryString);
        emit dataOperationFinished(success, "Delete");

        if (success) {
            qDebug() << "数据删除成功。";
        } else {
            qDebug() << "数据删除失败:" << query.lastError().text();
        }
    });
}

void MySQLThread::updateData(const QString &tableName, const QMap<QString, QVariant> &data, const QString &condition)
{
    performDatabaseOperation([=]() {
        QSqlQuery query(db);

        // 构建更新语句
        QString updateString;

        for (auto it = data.constBegin(); it != data.constEnd(); ++it) {
            updateString += it.key() + " = :" + it.key() + ", ";
            query.bindValue(":" + it.key(), it.value());
        }

        updateString.chop(2); // 移除末尾的 ", "

        QString queryString = QString("UPDATE %1 SET %2 WHERE %3").arg(tableName, updateString, condition);

        // 执行更新操作
        bool success = query.exec(queryString);
        emit dataOperationFinished(success, "Update");

        if (success) {
            qDebug() << "数据更新成功。";
        } else {
            qDebug() << "数据更新失败:" << query.lastError().text();
        }
    });
}

void MySQLThread::queryData(const QString &tableName, const QString &condition)
{
    performDatabaseOperation([=]() {
        QSqlQuery query(db);

        // 构建查询语句
        QString queryString = QString("SELECT * FROM %1 WHERE %2").arg(tableName, condition);

        // 执行查询操作
        bool success = query.exec(queryString);

        QList<QMap<QString, QVariant>> result;
        while (query.next()) {
            QMap<QString, QVariant> row;
            for (int i = 0; i < query.record().count(); ++i) {
                row[query.record().fieldName(i)] = query.value(i);
            }
            result.append(row);
        }

        emit dataQueried(result); // 发送查询结果信号

        if (success) {
            qDebug() << "查询数据成功。";
        } else {
            qDebug() << "查询数据失败:" << query.lastError().text();
        }
    });
}

bool MySQLThread::createConnection(const QString &hostname, const QString &databaseName, const QString &username, const QString &password)
{
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName(hostname);
    db.setDatabaseName(databaseName);
    db.setUserName(username);
    db.setPassword(password);

    if (!db.open()) {
        qDebug() << "打开数据库失败:" << db.lastError().text();
        return false;
    }

    return true;
}
#include <QCoreApplication>
#include "MySQLThread.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    MySQLThread thread;

    // 连接数据库
    thread.connectToDatabase("localhost", "mydatabase", "username", "password");

    // 响应数据操作完成信号的槽函数
    QObject::connect(&thread, &MySQLThread::dataOperationFinished, [](bool success, const QString &operation) {
        if (success) {
            qDebug() << "数据" << operation << "成功。";
        } else {
            qDebug() << "数据" << operation << "失败。";
        }
    });

    QObject::connect(&thread, &MySQLThread::dataQueried, [](const QList<QMap<QString, QVariant>> &result) {
        qDebug() << "查询结果:";
        for (const auto &row : result) {
            qDebug() << "姓名:" << row["name"].toString() << ", 年龄:" << row["age"].toInt();
        }
    });

    // 启动线程
    thread.start();

    // 插入数据示例
    QMap<QString, QVariant> data;
    data["name"] = "John Doe";
    data["age"] = 30;
    thread.insertData("users", data);

    // 查询数据示例
    thread.queryData("users", "age > 25");

    // 等待线程退出
    thread.quit();
    thread.wait();

    // 断开数据库连接
    thread.disconnectFromDatabase();

    return a.exec();
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Studio 数据库增删改查操作可以通过使用 SQLite 数据库实现。以下是一些基本的操作: 1. 增加数据:使用 insert() 方法向数据库添加新的数据。 2. 删除数据:使用 delete() 方法从数据库删除数据。 3. 修改数据:使用 update() 方法修改数据库的数据。 4. 查询数据:使用 query() 方法从数据库查询数据。 在进行这些操作之前,需要先创建数据库和表格,并定义相应的数据模型。可以使用 SQLiteOpenHelper 类来创建和管理数据库。 在进行增删改查操作时,需要使用 SQLiteDatabase 类来执行相应的操作。可以使用 ContentValues 类来存储数据,以便在插入或更新数据时使用。 需要注意的是,在进行数据库操作时,应该使用异步任务或线程执行,以避免阻塞 UI 线程。可以使用 AsyncTask 类或 HandlerThread 类来实现异步操作。 以上是 Android Studio 数据库增删改查的基本操作,具体实现可以参考相关的文档和示例代码。 ### 回答2: Android Studio 是一个常用的开发工具,它的数据库操作功能不仅能够帮助开发者提高开发效率,还能帮助我们更好地处理数据。接下来将会介绍如何在 Android Studio 数据库进行增删改查。 1. 创建数据库 Android 数据库操作依赖 SQLite,所以需要先引入 SQLite 相关的依赖。然后在创建数据库之前,需要定义表的结构。这可以通过创建一个 Java 类来实现。在该类定义表的结构,每个属性代表表的一列。创建完 Java 类后,使用该类的属性创建数据库表。下面是一个例子: ```java public class DBHelper extends SQLiteOpenHelper { public static final String CREATE_USER = "create table user (" + "id integer primary key autoincrement, " + "name text, " + "age integer, " + "height real)"; private Context mContext; private SQLiteDatabase db; public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); mContext = context; } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { sqLiteDatabase.execSQL(CREATE_USER); Toast.makeText(mContext, "创建数据库成功", Toast.LENGTH_SHORT).show(); db = sqLiteDatabase; } } ``` 在上面的代码,我们创建了一个 DBHelper 类来操作数据库,其 CREATE_USER 是创建数据表 user 的 SQL 语句,onCreate 方法调用了 sqLiteDatabase 的执行 SQL 语句方法 execSQL,从而创建了 user 数据表。 2. 数据库增删改查 接下来,我们需要对数据库进行增删改查操作。常见的数据库操作有增加数据、删除数据、修改数据和查询数据。 增加数据: ```java ContentValues values = new ContentValues(); values.put("id", 1); values.put("name", "小明"); values.put("age", 20); values.put("height", 1.75); db.insert("user", null, values); ``` 对表 user 进行插入数据操作,使用 ContentValues 对象组装待插入的数据,调用 SQLiteDatabase 的 insert 方法,即可完成数据插入。 删除数据: ```java db.delete("user", "id = ?", new String[]{"1"}); ``` 其 delete 方法需要传入三个参数,第一个参数是表明,第二个参数是 SQL 语句的 WHERE 条件,第三个参数是 WHERE 条件的占位符。 修改数据: ```java ContentValues values = new ContentValues(); values.put("age", 21); values.put("height", 1.80); db.update("user", values, "id = ?", new String[]{"1"}); ``` 其 update 方法也需要传入三个参数,第一个参数是表明,第二个参数是待更新的数据,第三个参数是 SQL 语句的 WHERE 条件。 查询数据: ```java Cursor cursor = db.query("user", null, null, null, null, null, null); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); float height = cursor.getFloat(cursor.getColumnIndex("height")); Log.i(TAG, "id:" + id + " 姓名:" + name + " 年龄:" + age + " 身高:" + height); } ``` 其 query 方法需要传入七个参数,第一个参数是表名,第二个参数是待查询的列名,第三个到第七个参数是 SQL 的其他操作,返回值是一个 Cursor 对象,通过遍历该对象的数据,即可完成数据查询。 3. 总结 Android Studio 数据库操作,最重要的是创建数据库和创建表的工作,需要在代码显式地创建和定义。增删改查操作本质上是对数据库和表的增删改查操作,需要通过调用相应的方法进行实现。每个方法都需要传入对应的参数,因此在操作时必须弄清楚参数的含义和对应的 SQL 语句的语法。 ### 回答3: Android Studio是Android开发人员非常常用的一款集成开发环境(IDE)。在Android应用开发,常常需要用到数据库来进行数据存储。而数据库操作包括增、删、改、查四个方面,而这四个方面的实现是相对独立的。 以下将针对Android Studio数据库增删改查的实现进行讲解。 首先,需要了解Android开发常用的SQLite数据库。在Android Studio,我们可以使用SQLiteOpenHelper类来创建和管理数据库。SQLiteOpenHelper有两个方法是非常重要的:onCreate()和onUpgrade()。onCreate()方法用于第一次创建数据库时进行表结构的创建,onUpgrade()方法用于数据库版本升级时进行数据迁移。 接下来,我们分别介绍如何实现增、删、改、查四个操作。 1. 数据库增加数据 对于SQLite数据库而言,数据的添加直接使用SQL语句即可。如下面的示例代码所示: ```Java public void insertData(String name, String age) { SQLiteDatabase db = this.getWritableDatabase(); //获取可写数据库 ContentValues values = new ContentValues(); values.put("name", name); values.put("age", age); db.insert("user", null, values); db.close(); } ``` 首先,我们需要获取可写数据库,然后将要插入的数据封装到ContentValues对象,最后使用insert()方法在表增加数据即可。 2. 数据库删除数据 对于数据库的数据删除操作,同样需要使用SQL语句。如下面的示例代码所示: ```Java public void deleteData(int id) { SQLiteDatabase db = this.getWritableDatabase(); //获取可写数据库 db.delete("user", "id = ?", new String[]{ String.valueOf(id) }); db.close(); } ``` 其,delete()函数的第二个参数用于指定删除数据库的条件。删除指定id的一行数据,调用delete()时就可以把id传入参数。 3. 数据库更新数据 数据库的数据更新操作同样需要使用SQL语句,可以使用update()方法来进行更新。如下面的示例代码所示: ```Java public void updateData(int id, String name, String age) { SQLiteDatabase db = this.getWritableDatabase(); //获取可写数据库 ContentValues values = new ContentValues(); values.put("name", name); values.put("age", age); db.update("user", values, "id = ?", new String[]{ String.valueOf(id) }); db.close(); } ``` 其的update()方法需要传入的参数分别为需要更新的内容、更新条件和条件参数。根据id值找到对应的一行数据,从而进行更新操作。 4. 数据库查询数据 Android Studio提供了非常方便的查询接口,使用query()方法可以方便地完成数据的查询操作。如下面的示例代码所示: ```Java public Cursor queryData() { SQLiteDatabase db = this.getWritableDatabase(); //获取可写数据库 Cursor cursor = db.query("user", new String[]{ "id", "name", "age" }, null, null, null, null, null); return cursor; } ``` 这里的Cursor对象代表一个指向查询结果的指针,可以通过它来遍历整个结果集。在上面的示例代码,query()方法的第一个参数指定了查询的表名,第二个参数指定了需要查询的字段,第三个参数指定了查询条件,第四、五、六个参数分别表示分组、过滤和排序的条件。最后返回查询结果的Cursor对象即可。 总结: 本文介绍了Android Studio如何使用SQLiteOpenHelper类来创建和管理数据库,以及如何实现数据库的增、删、改、查四个操作。SQLite数据库是Android最常用的数据库之一,它轻巧便捷,对于简单的数据存储操作非常方便。在实际开发,可以根据具体的需求,灵活使用各种数据库操作方式来实现功能的开发

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值