【问题标题】:sqlite commands possibly not working in qtsqlite 命令可能在 qt 中不起作用
【发布时间】:2018-04-16 10:44:26
【问题描述】:

我正在使用 Qt 和 Sqlite3 制作图书馆管理软件。

构造函数:

db = QSqlDatabase :: addDatabase("QSQLITE");
model = new QSqlTableModel(this, db);

db.setDatabaseName(":/lib/libre coupe.db");
db.setHostName("Libre Coupe");

if(db.open())
{
    QSqlQuery query(db);
    if (! query.exec("CREATE TABLE IF NOT EXISTS books (NAME VARCHAR(100) NOT NULL, AUTHOR VARCHAR(100) NOT NULL, UID VARCHAR(100) NOT NULL) "))
    {
        QMessageBox::information(this, "title", "Unable to use Sqlite");
    }

    if(query.lastError().text() != " ")
        QMessageBox::critical(this, "Oops", query.lastError().text());

    model->setTable("books");
    model->select();

    model->setHeaderData(0, Qt::Horizontal, tr("Name") );
    model->setHeaderData(1, Qt::Horizontal, tr("Author") );
    model->setHeaderData(2, Qt::Horizontal, tr("Uid") );
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);

    if(!query.exec("SELECT * FROM books;"))
        QMessageBox::critical(this, "Oops", query.lastError().text());

    int i = 0;

    while(query.next())
    {
        model->setData(model->index(i, 0), query.value(query.record().indexOf("NAME")));
        model->setData(model->index(i, 1), query.value(query.record().indexOf("AUTHOR")));
        model->setData(model->index(i, 2), query.value(query.record().indexOf("UID")));

        ++i;
    }
}
else
    QMessageBox::critical(this, "Oops!", "Could not open the database");\

我遇到了数据库没有自动创建的问题。因此,我手动创建了它并将其添加到我的资源中,以便它存在于使用我的应用程序的每台计算机上。

我运行我的应用程序并转到包含“libre coupe.db”的目录。在那里使用终端,我发现没有创建表。我没有看到任何错误消息。我的其他功能(例如保存)也不起作用,而使用终端直接输入 Sqlite 的相同命令按预期工作。

我什至使用了调试器,发现程序确实进入了 if 条件,即数据库成功打开。

我使用以下命令检查表是否存在:

sqlite3 "libre coupe.db"
.tables

【问题讨论】:

  • db.setDatabaseName(":/lib/libre coupe.db"); 应该在db = QSqlDatabase :: addDatabase("QSQLITE"); 之后调用,我猜,否则你只需覆盖它。
  • 谢谢@vahancho。我也犯了这个错误

标签: qt sqlite qsqltablemodel


【解决方案1】:

第一行:

db.setDatabaseName(":/lib/libre coupe.db");

开头的“:”表示您正在尝试使用 Qt 的资源系统访问嵌入式二进制资源。

但是,SQLite 数据库不能存储在 Qt 资源系统中。如果您的数据库位于 /lib/libre coupe.db,则应删除开头的冒号。

【讨论】:

  • 其实一开始我不知道为什么,但是我无法创建数据库。但是现在刚刚添加了编写的 libre coupe 并且该程序可以正常工作。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2011-05-08
  • 2015-05-20
相关资源
最近更新 更多