找回密码
 立即注册
收起左侧

关于Qt连接SqLite数据库的一些问题

3
回复
6871
查看
[复制链接]
累计签到:9 天
连续签到:1 天
来源: 2017-2-13 17:33:39 显示全部楼层 |阅读模式
1Qter豆
第一次运行程序时创建了一个表,然后在这个表中插入了一些语句然后下次运行程序时,
为什么上次创建的那个表好像就不存在了,上次更新的数据也没有了

  1. #include <bookshow.h>
  2. #include <QMessageBox>
  3. #include <QHBoxLayout>
  4. #include <QVBoxLayout>
  5. #include <QInputDialog>

  6. BookShow::BookShow(QWidget *parent) :
  7.     QWidget(parent)
  8. {
  9.     if (openDataBase())
  10.     {
  11.         createDataBaseTable();
  12.         QStringList data;
  13.         data << "empty";
  14.         query->exec("select Book_Name from BookInfo");
  15.         while (query->next())
  16.             data << query->value(0).toString();
  17.         model = new QStringListModel(this);
  18.         model->setStringList(data);

  19.         view = new QListView;
  20.         view->setModel(model);

  21.         showButton = new QPushButton("Show", this);
  22.         QObject::connect(showButton, &QPushButton::clicked,
  23.                          this, &BookShow::showDetail);
  24.         deleteButton = new QPushButton("Delete", this);
  25.         QObject::connect(deleteButton, &QPushButton::clicked,
  26.                          this, &BookShow::deleteData);
  27.         insertButton = new QPushButton("Insert", this);
  28.         QObject::connect(insertButton, &QPushButton::clicked,
  29.                          this, &BookShow::insertData);

  30.         QHBoxLayout *buttonLayout = new QHBoxLayout;
  31.         buttonLayout->addWidget(deleteButton);
  32.         buttonLayout->addWidget(showButton);
  33.         buttonLayout->addWidget(insertButton);

  34.         QVBoxLayout *mainLayout = new QVBoxLayout;
  35.         mainLayout->addWidget(view);
  36.         mainLayout->addLayout(buttonLayout);
  37.         setLayout(mainLayout);
  38.     }
  39. }


  40. bool BookShow::openDataBase()
  41. {
  42.     DataBase = QSqlDatabase::addDatabase("QSQLITE");
  43.     DataBase.setHostName("localHost");
  44.     DataBase.setDatabaseName("MyBook");
  45.     DataBase.setUserName("root");
  46.     DataBase.setPassword("123456");
  47.     if (DataBase.open())
  48.     {
  49.         query = new QSqlQuery(DataBase);
  50.         return true;
  51.     }
  52.     QMessageBox::information(this, "error", "The DataBase failed to open!");
  53.     return false;
  54. }

  55. bool BookShow::createDataBaseTable()
  56. {
  57.     QString tableName = "BookInfo";
  58.     query->exec(QString("select * from sys.tables where name = '%1' ").arg(tableName));
  59.     if (!query->next())
  60.         return false;
  61.     query->exec(QString("create table '%1'"
  62.                        "(Book_Name varchar(20),"
  63.                        "Author varchar(10),"
  64.                        "Word_Count int,"
  65.                        "Serial_Status bit").arg(tableName));
  66.     return true;
  67. }

  68. void BookShow::showDetail()
  69. {

  70. }

  71. void BookShow::deleteData()
  72. {

  73. }

  74. void BookShow::insertData()
  75. {
  76.     bool isOk;
  77.     QString text = QInputDialog::getText(this, "Insert",
  78.                                          "Please input new data:",
  79.                                          QLineEdit::Normal,
  80.                                          "you are inserting new data",
  81.                                          &isOk);
  82.     if(isOk)
  83.     {
  84.         QModelIndex currIndex = view->currentIndex();
  85.         model->insertRows(currIndex.row(), 1);
  86.         model->setData(currIndex, text);
  87.         view->edit(currIndex);
  88.         query->exec(QString("insert into BookInfo(Book_Name) values('%1')").arg(text));
  89.     }
  90. }
复制代码


最佳答案

查看完整内容

sqlite3_open(const char *filename, sqlite3 **ppDb); 该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。 如果 filename 参数是 NULL 或 ':memory:',那么 sqlite3_open() 将会在 RAM 中创建一个内存数据库,这只会在 session 的有效时间内持续。 如果文件名 filename 不为 NULL,那么 sqlite3_open() 将使用这个参数值尝试打开数据库文件。如果该名称的文件不存在,sqlite3_open() ...
回复

使用道具 举报

累计签到:25 天
连续签到:1 天
2017-2-13 17:33:40 显示全部楼层

sqlite3_open(const char *filename, sqlite3 **ppDb);
该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。
如果 filename 参数是 NULL 或 ':memory:',那么 sqlite3_open() 将会在 RAM 中创建一个内存数据库,这只会在 session 的有效时间内持续。
如果文件名 filename 不为 NULL,那么 sqlite3_open() 将使用这个参数值尝试打开数据库文件。如果该名称的文件不存在,sqlite3_open() 将创建一个新的命名为该名称的数据库文件并打开。
回复

使用道具 举报

尚未签到

2017-2-14 01:54:28 显示全部楼层
你创建的是内存的数据库,你要写上文件名才会写进硬盘,好像是在adddatabase这个函数里面,忘了,具体请看文档
回复

使用道具 举报

累计签到:25 天
连续签到:1 天
2017-2-14 09:03:41 显示全部楼层
本帖最后由 dearcc 于 2017-2-14 09:25 编辑
  1. DataBase = QSqlDatabase::addDatabase("QSQLITE");
  2.     DataBase.setHostName("localHost");
  3.     DataBase.setDatabaseName("MyBook.db");//这里,首先还得使用QFile创建一个MyBook.db
  4.     DataBase.setUserName("root");//默认应该是无用的
  5.     DataBase.setPassword("123456");
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了