首页 > 解决方案 > 如何使用 SQLITE 处理 QTableView 上的 BLOB/TEXT

问题描述

我正在设计一个具有多个字段和功能的主要用户界面。然而,为了缩小问题,我创建了一个包含 4 列的小型应用程序:名称、图像、数据库、日期时间。

我有一个带有 QTableView 的 MainWindow,只要我在 QTableView 内单击鼠标右键,就会打开一个 AddItemDialog:

1) 名称LineEdit

2) ImLine编辑

3) imageLineEdit - 它包含图像的路径

4) 日期时间编辑

小例子也可以在这里看到:注意我正在使用一个菜单来擦除/添加记录

图形用户界面

我遇到的问题是我不一定要在 QTableView 上保存图像(BLOB),如果发生这种情况,我希望该列接受 TEXT“无图像”,但是如果在存储图像期间,用户决定返回并保存图像是可能的。

因此,为了提供视觉理解,请查看我尝试不保存图像时遇到的错误:

错误信息

到目前为止我尝试了什么:

这个想法(以及我试图实现的可能解决方案)是创建一个更新行的函数,但它不起作用:

bool dataBase::updateItem(const Item &item)
{
    QSqlQuery qry;
    qry.prepare(" UPDATE Fish_Table SET " \
    " name = ?, image = ?, dataDataBase = ?, dateTime = ?");

    q.addBindValue(item.name());
    q.addBindValue(item.image());
    q.addBindValue(item.imagesData());
    q.addBindValue(item.dateTime());
}

最小应用程序的代码如下所示:

我在下面包含了应用程序中最重要的部分以及我遵循的程序的相关描述:

我用字段item.h创建了一个项目:

class Item
{
public:
    Item(const double dateTime,
         const QString &name = "", const QString &image = "",
         const QByteArray &imagesData = QByteArray());
    QString name() const { return mName; }
    QString image() const { return mImage; }
    QByteArray imagesData() const { return mImagesData; }
    double dateTime() const { return mDateTime; }
private:
    QString mName;
    QString mImage;
    QByteArray mImagesData;
    double mDateTime;
};

及其相关item.cpp

Item::Item(const double dateTime,
           const QString &name, const QString &image,
           const QByteArray &imagesData)
{
    mName = name;
    mImage = image;
    mImagesData = imagesData;
    mDateTime = dateTime;
}

我创建了一个database.h表,其中包含如下参数:

class dataBase : public QObject
{
    Q_OBJECT
public:
    explicit dataBase(QObject *parent = nullptr);
    bool inizializationDataBase(const QString &nameDataBase);
    bool configureDataBase();
    QString getError() const { return mError; }
    bool addItem(const Item &item);
private:
    QSqlDatabase mDatabase;
    QString mError;
};

及其相关的database.cpp文件——我只包括该文件最重要的一段代码:

#define CREATE_TABLE \
     " CREATE TABLE IF NOT EXISTS Fish_Table" \
     " (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" \
     ", name TEXT NOT NULL" \
     ", image TEXT NOT NULL" \
     ", dataDataBase BLOB NOT NULL" \
     ", dateTime DOUBLE NOT NULL)"

dataBase::dataBase(QObject *parent)
    : QObject(parent)
{
}

bool dataBase::inizializationDataBase(const QString &nameDataBase) {
    // code
}

bool dataBase::addItem(const Item &item) {
    QSqlQuery q;
    q.prepare("INSERT INTO Fish_Table (name, image, dataDatabase, dateTime) VALUES (?,?,?,?)");
    q.addBindValue(item.name());
    q.addBindValue(item.image());
    q.addBindValue(item.imagesData());
    q.addBindValue(item.dateTime());
    bool ok = q.exec();
    if (!ok) {
        mError = q.lastError().text();
    }
    return ok;
}

最后是包含我试图传递给 MainWindow 的 QTableView 的字段的AddItemDialog.cpp 。

AddItemDialog::AddItemDialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::AddItemDialog)
{
    ui->setupUi(this);
    auto fileSystemModel = new QFileSystemModel(this);
    fileSystemModel->setRootPath(QDir::rootPath());
    ui->imageLineEdit->setCompleter(new QCompleter(fileSystemModel,this));
    QDateTime dateTime;
    dateTime.setDate(QDate::currentDate());
}

AddItemDialog::~AddItemDialog()
{
    delete ui;
}

void AddItemDialog::on_toolButton_clicked()
{
    auto nameDataBase = QFileDialog::getOpenFileName(this, "Open Images", QDir::rootPath(),
                  "Images (*.png *.jpg *jpeg *.tif *.tiff);;Any type (*.*)");
    ui->imageLineEdit->setText(nameDataBase);
}

void AddItemDialog::on_buttonBox_accepted()
{
    QFile dataBase(ui->imageLineEdit->text());
    if (!dataBase.open(QIODevice::ReadOnly)) {
        QMessageBox::critical(this, "Error", dataBase.errorString());
        return;
    }
    mItem = Item(ui->nameLineEdit->text(),
                 ui->ImLineEdit->text(),dataBase.readAll());
    dataBase.close();
    accept();
}

预期结果:如果用户决定保存图片没有问题,但如果用户决定不保存图片,那么应该在图片的单元格中出现TEXT“No Image”,SQLITE中如何处理这个异常/ QT?请参阅下面我试图实现的正确方法:

预期的

实际结果:我只能保存图像。如果我没有收到错误消息。

感谢阐明这一点。

标签: sqliteqt5

解决方案


推荐阅读