#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
будет более чем необходимой.