每次我在我的DatabaseManager类的头文件中声明QSqlDatabse
连接时,我的应用程序崩溃并显示一条消息: 程序意外完成 ?
如果我将声明放在源文件中,我的应用程序可以正常工作。
修改
这是头文件:
#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 ";
}
答案 0 :(得分:0)
我认为这里有一些问题。
在 open_db() 方法中,请记住C ++中的内存管理是如何工作的。没有任何定义在那里将生存。所以对于以下几行:
QSqlDatabase db;
db = database;
您实际做的是定义 db ,然后将其设置为 数据库的值,这没什么。然后,您将 db 初始化为您想要的值,但这并不重要,因为当方法返回时,将自动销毁所有值。 数据库 变量永远不会设置为任何内容。 在 open_db() 中,只需初始化您在班级中定义的变量,而不是:
database = QSqlDatabase::addDatabase("QSQLITE");
database .setDatabaseName(path+"Database v.1");
if (database .open()){
然后在 create_db_tables() 中,您必须使用刚创建的数据库初始化QSqlQuery对象,如下所示:
QSqlQuery query(database);
一旦你这样做,其他一切都应该开始正常工作。