如何使用SQlite

时间:2019-01-22 03:00:24

标签: sqlite qt5

我正在设计一个具有多个字段的主要用户界面。 为了缩小问题,我创建了一个包含5列的小型最小应用程序:名称,图像,数据库,dateTime和coordNumber。

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

1) nameLineEdit
2) ImLineEdit
3) imageLineEdit
4) dateTimeEdit
5) numLineEdit 

我遇到的问题是,当数字为负数时,我找不到通过AddItemDialog 接受5)numLineEdit的方法。 目前,它只保存正数。如何处理此异常?

我从official document阅读,但是我不知道。但是,总是from this official source似乎必须将负数解释为“无限制”值。解释很简短,并且没有提供任何有用的小例子,因此我仍然不确定如何进行。

我将下面应用程序的最重要部分与我遵循的过程的相关描述一起包括在内:

我创建了一个包含 item.h 字段的项目:

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

及其相关的 item.cpp

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

我创建了一个 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" \
     ", num INTEGER NOT NULL)"  

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

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

最后是 AddItemDialog.cpp ,其中包含我要传递给MainWindow的QTableView的字段。

AddItemDialog.cpp

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->dateTimeEdit->dateTime(),
                 ui->nameLineEdit->text(),
                 ui->ImLineEdit->text(),
                 ui->numLineEdit->text(),
                 dataBase.readAll());
    dataBase.close();
    accept();
}

我希望在QTableView上保存正数或负数,但是到目前为止,我只能保存正数。如何处理此异常?

1 个答案:

答案 0 :(得分:0)

因此答案是肯定的,可以处理负数。由于某些原因,我认为SQL无法做到这一点,但以下是处理该异常的一个小例子:

#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" \
     ", num INTEGER NOT NULL)"  

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

bool dataBase::addItem(const Item &item) {
    QSqlQuery q;
    q.prepare("INSERT INTO Fish_Table (name, image, dataDatabase, dateTime, num) VALUES (name,descriptionOfImage,BLOB(actual image), put date&time,-200)");
    q.addBindValue(item.name());
    q.addBindValue(item.image());
    q.addBindValue(item.imagesData());
    q.addBindValue(item.dateTime());
    q.addBindValue(item.num());
    bool ok = q.exec();
    if (!ok) {
        mError = q.lastError().text();
    }
    return ok;
}

This也是非常有价值的资源。

如果还需要将正数转换为负数,则可以采用以下解决方案:

UPDATE Table
SET field= (field * -1)
Where SIGN(field) = -1 

Also this在有人需要SQL代码作为其他来源的情况下非常有用。