База данных QSQLD: ошибка инициализации SIGSEV

#c #c 11 #sqlite #qt5

#c #c 11 #sqlite #qt5

Вопрос:

Я получаю SIGSEV ошибку от компилятора, но я не уверен, почему. Я пытаюсь сохранить пример данных на QTableView . Для этого я создал небольшой набор параметров и в классе dataInfo я создал initDataBase(const QString amp;nameDB) функцию для инициализации базы данных. Когда я запускаю small .ui, компилятор завершает работу с ошибкой QSqlDatabase::addDatabase("QSQLITE"); . Также, чтобы исключить один из вариантов, я добавил в файл .pro QT = core gui sql инструкцию в качестве стандартной процедуры, но по-прежнему безуспешно.

Процесс, которому я следую, является:

1) Устанавливаем параметры, как показано ниже:

imageparam.h

 #ifndef IMAGEPARAM_H
#define IMAGEPARAM_H
#include <QString>
typedef struct Param
{
    int mId;
    QString mPath1;
    QString mPath2;
    QByteArray mImage1;
    QByteArray mImage2;
} Param;
class ImageParam
{
public:
    ImageParam(Param newdata);
    ImageParam(int id, const QString amp;path1, QString amp;path2,
               const QByteArray amp;image1, const QByteArray amp;image2);
    int id() const { return data.mId; }
    QString path1() const { return data.mPath1; }
    QString path2() const { return data.mPath2; }
    QByteArray image1() { return data.mImage1; }
    QByteArray image2() { return data.mImage1; }
private:
    Param data;
};
  

imageparam.cpp

 #include "imageparam.h"
ImageParam::ImageParam(Param newdata)
{
    data = newdata;
}
ImageParam::ImageParam(int id, const QString amp;path1, QString amp;path2,
                       const QByteArray amp;image1, const QByteArray amp;image2)
{
    data.mId = id;
    data.mPath1 = path1;
    data.mPath2 = path2;
    data.mImage1 = image1;
    data.mImage2 = image2;
}
  

2) Настройка QSQLITE базы данных

datainfo.h

 #ifndef DATAINFO_H
#define DATAINFO_H
#include <QObject>
#include <QtSql/QSqlDatabase>
#include "imageparam.h"
class dataInfo : public QObject
{
    Q_OBJECT
public:
    explicit dataInfo(QObject *parent = nullptr);
    QString getError() const { return mError; }
    bool initDataBase(const QString amp;nameDB);
    bool confDataBase();
    bool addItem(ImageParam* imageItem);
    bool updateItem(int idItem, ImageParam* imageItem);
    QSqlDatabase getDatabase();
private:
    QString mError;
    QSqlDatabase mDBImages;

};

#endif // DATAINFO_H
  

datainfo.cpp

 #include "datainfo.h"
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlError>
#include <QDebug>
#include <QVariant>
#define CREATE_TABLE 
    " CREATE TABLE IF NOT EXISTS imageTable" 
    " (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" 
    " path1 TEXT NOT NULL" 
    " path2 TEXT NOT NULL" 
    " imageA BLOB NOT NULL" 
    " imageB BLOB NOT NULL)"

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

bool dataInfo::initDataBase(const QString amp;nameDB)
{
    mDBImages = QSqlDatabase::addDatabase("QSQLITE"); // <-- ERROR HERE
    mDBImages.setDatabaseName(nameDB);
    bool ok = mDBImages.open();
    if(!ok) {
        mError = mDBImages.lastError().text();
        qDebug() << mError;
    }
    return ok;
}
  

3) на mainwindow.cpp Я создаю экземпляр, как показано ниже:

 #include "mainwindow.h"
#include "ui_mainwindow.h"
#include "datainfo.h"

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);

        // temporary folder
        temporaryFolder = "/home/to/Desktop/folder/tmp.db";
        QFile dbRem(temporaryFolder);
        dbRem.remove();
        mNewDatabaseImages->initDataBase(temporaryFolder); // <-- ERROR HERE
        mNewDatabaseImages->confDataBase();
        mNewTableImages = new QSqlTableModel(this, mNewDatabaseImages->getDatabase());
        mNewTableImages->setTable("imageTable");
        mNewTableImages->select();
        ui->bookMarkTableView->setModel(mNewTableImages);
        ui->bookMarkTableView->showColumn(true);
    }
  

Есть идеи о том, чего мне не хватает в этом фрагменте кода?
Спасибо, что пролили свет на это.

Комментарии:

1. «Я получаю ошибку SIGSEV от компилятора» — Не-а. Ошибка сегментации — это то, что происходит во время выполнения, после того, как компилятор собрал ваш код и вы затем запускаете его. Что говорит вам ваш отладчик? Как выглядит трассировка стека при сбое? Каковы значения соответствующих переменных при сбое? Какими вы ожидали их увидеть? Короче говоря; отладить проблему.

2. Привет, Йеспер Юл, похоже, что отладчик проходит через, mDBImages = QSqlDatabase::addDatabase("QSQLITE"); который является функцией инициализации базы данных, присутствующей в dataInfo классе. Кажется, есть default connection ошибка, смотрите здесь , если это поможет.

Ответ №1:

@ Emanuele, я думаю, тебе не хватает какого-то синтаксиса при SQL попытке переключить это на себя datainfo.cpp

 #include "datainfo.h"
#define CREATE_TABLE 
    " CREATE TABLE IF NOT EXISTS yourTable" 
    " (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" 
    " path1 TEXT NOT NULL" 
    " path2 TEXT NOT NULL" 
    " imageA BLOB NOT NULL" 
    " imageB BLOB NOT NULL)"
  

с помощью следующего кода

 #include "datainfo.h"
#define CREATE_TABLE 
    " CREATE TABLE IF NOT EXISTS yourTable" 
    " (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" 
    ", path1 TEXT NOT NULL" 
    ", path2 TEXT NOT NULL" 
    ", imageA BLOB NOT NULL" 
    ", imageB BLOB NOT NULL)"
  

Комментарии:

1. Большое тебе спасибо, Йода! В следующий раз проверка на ошибку синтаксиса SQL будет более чем необходимой.