0

每次我QSqlDatabse在我的 DatabaseManager 类的头文件中声明连接时,我的应用程序都会崩溃并显示一条消息:程序意外完成?!

如果我将声明放在源文件中,我的应用程序就可以正常工作。

  1. 为什么会发生这种情况和
  2. 如何解决?

编辑:

这是头文件:

#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 ";

}
4

1 回答 1

0

我认为这里有一些问题。

open_db()方法中,请记住 C++ 中的内存管理是如何工作的。在那里定义的任何东西都不会存在。所以对于以下几行:

QSqlDatabase db;
db = database;

您实际上在做的是定义db,然后将其设置为database的值,这没什么。然后,您将db初始化为您想要的值,但这并不重要,因为当方法返回时,所有这些都会自动销毁。数据库变量永远不会被设置为任何值。在open_db()中,只需初始化您在类中定义的变量,如下所示:

database = QSqlDatabase::addDatabase("QSQLITE");
database .setDatabaseName(path+"Database v.1");
if (database .open()){

然后在create_db_tables()中,您必须使用刚刚创建的数据库初始化 QSqlQuery 对象,如下所示:

QSqlQuery query(database);

一旦你这样做了,其他一切都应该开始正常工作。

于 2015-12-23T16:50:46.707 回答