sqlite - 如何使用 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?请参阅下面我试图实现的正确方法:
实际结果:我只能保存图像。如果我没有收到错误消息。
感谢阐明这一点。
解决方案
推荐阅读
- java - 用于 jsp 标记中的每个值
- ruby-on-rails - 使用 headless chrome 在 rails 中进行测试时出现 ElementNotVisibleError
- html - 在 Bootstrap 4 的小屏幕上隐藏一列
- scala - 基于字符串的 SCALA 列表分区
- java - java反射仅获取所有用户创建的类变量
- ios - iOS - 在stackview中查看不显示阴影
- javascript - decodeAudioData 将 ArrayBuffer 转换为 Float32Array
- javascript - 使用 ArcGIS 的 Javascript:InfoWindow 不显示字段中的值
- python - 如何使用熊猫或正则表达式提取以下内容
- javascript - 检查幻灯片切换的状态在赛普拉斯测试中不起作用