Каждый раз, когда я заявляю QSqlDatabse
соединение в заголовочном файле моего класса DatabaseManager, мое приложение вылетает с сообщением: программа неожиданно завершилась ?!
Если я помещу объявление в исходный файл, мое приложение будет работать нормально.
Редактировать:
вот заголовочный файл:
#ifndef DATABASEMANAGER_H
#define DATABASEMANAGER_H
#include <QObject>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
class DatabaseManager : public QObject
{
Q_OBJECT
public:
explicit DatabaseManager(QObject *parent = 0);
public:
QString open_db();
QString create_db_tables();
QSqlDatabase get_db();
QSqlDatabase database;
};
#endif // DATABASEMANAGER_H
вот исходный файл:
#include "databasemanager.h"#include <QDir>
#include <QCoreApplication>
#include <QDebug>QString DatabaseManager::open_db()
{
QSqlDatabase db;
db = database;
QString path = "/Users/abubakr/Documents/workspace/Muasaa/";
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(path+"Database v.1");
if (db.open()){
return "Database is created and open, Application is ready ...";
} else {
return db.lastError().text();
}
}
QSqlDatabase DatabaseManager::get_db(){
}
QString DatabaseManager::create_db_tables(){
QSqlQuery query;
//****************************************
//create personal_info table
//****************************************
query.prepare("CREATE TABLE IF NOT EXISTS personal_Info""(ref_no NTEGER UNIQUE PRIMARY KEY,""name VARCHAR(30), father VARCHAR(30), grandfather VARCHAR(30), mother VARCHAR(30), tel VARCHAR(30),""email VARCHAR(30), post_code VARCHAR(30), address VARCHAR(30))");
if (!query.exec()) return query.lastError().text();
//****************************************
//create familly_info table
//****************************************
query.prepare("CREATE TABLE IF NOT EXISTS familly_Info""(ref_no NTEGER UNIQUE PRIMARY KEY,""spouse VARCHAR(30), father_in_law VARCHAR(30), mother_in_law VARCHAR(30), childern VARCHAR(30))");
if (!query.exec()) return query.lastError().text();//****************************************
//create payment_info table
//****************************************
query.prepare("CREATE TABLE IF NOT EXISTS payment_Info""(ref_no NTEGER UNIQUE PRIMARY KEY,""payment VARCHAR(30), payment_method VARCHAR(30))");
if (!query.exec()) return query.lastError().text();return "Tables created successfully ";
}
Я думаю, что здесь есть пара вещей не так.
в open_db () Помните, как работает управление памятью в C ++. Ничто из того, что там определено, не выживет. Так что для следующих строк:
QSqlDatabase db;
db = database;
что вы на самом деле делаете, это определение децибел, затем установить его на значение база данных, что ничего Затем вы инициализируете децибел значения, которые вы хотите, но это не имеет значения, потому что, когда метод возвращает, все будут уничтожены автоматически. база данных переменная никогда не устанавливается ни к чему.
в open_db () просто инициализируйте переменную, которую вы определили в своем классе, вот так:
database = QSqlDatabase::addDatabase("QSQLITE");
database .setDatabaseName(path+"Database v.1");
if (database .open()){
затем в create_db_tables () Вы должны инициализировать объект QSqlQuery с базой данных, которую вы только что создали, следующим образом:
QSqlQuery query(database);
Как только вы это сделаете, все остальное должно начать работать правильно.
Других решений пока нет …