【问题标题】:Import SQLite database using Qt/QSqlDatabase使用 Qt/QSqlDatabase 导入 SQLite 数据库
【发布时间】:2014-11-19 10:15:09
【问题描述】:

我有两个独立的应用程序,一个放在生产中,另一个放在办公室,我需要在生产端生成和更新 sqlite 数据库副本 .

到目前为止,我已经尝试了两种方法:

  1. 从生产应用程序复制整个 sqlite 文件并将我的 QSqlDatabase 句柄“重定向”到该文件(无法使其工作,许多连接已打开且并非全部可关闭)
  2. 通过网络访问 sqlite-db,查询所有数据并使用 sql 插入缺失的数据(有效,但由于数据很多,因此需要太多时间)

是否有可能导入或可能覆盖现有的数据库(甚至是单个表,放置在不同的文件中),其中仍有打开的连接?

使用:Qt 4.8、SQLite、Windows 7、VS2010

【问题讨论】:

  • 将文件复制到本地临时目录,然后使用备份API替换数据库。
  • 出于备份原因,文件已被复制...尽快查看备份 api 并在此处留下反馈!谢谢
  • @CL。奇迹般有效!谢谢你的小费。将其添加为答案,我会投票并接受它:-)
  • 你可以自己回答。

标签: qt sqlite


【解决方案1】:

所以最后我能够通过使用 sqlite 备份 api(在大多数 Qt 版本中以 .h 和 .c 分发)来实现我的目标。在文档页面SQLite Backup 上有一些示例,其中将数据库从文件复制到内存数据库,或从内存复制到文件。就我而言,我使用了以下功能(来自 doc 页面的 1:1,仅删除了几个 cmets):

int loadOrSaveDb(sqlite3 *pInMemory, const char *zFilename, int isSave){
  int rc;                   /* Function return code */
  sqlite3 *pFile;           /* Database connection opened on zFilename */
  sqlite3_backup *pBackup;  /* Backup object used to copy data */
  sqlite3 *pTo;             /* Database to copy to (pFile or pInMemory) */
  sqlite3 *pFrom;           /* Database to copy from (pFile or pInMemory) */

  /* Open the database file identified by zFilename. Exit early if this fails
  ** for any reason. */
  rc = sqlite3_open(zFilename, &pFile);
  if( rc==SQLITE_OK ){

    pFrom = (isSave ? pInMemory : pFile);
    pTo   = (isSave ? pFile     : pInMemory);

    pBackup = sqlite3_backup_init(pTo, "main", pFrom, "main");
    if( pBackup ){
      (void)sqlite3_backup_step(pBackup, -1);
      (void)sqlite3_backup_finish(pBackup);
    }
    rc = sqlite3_errcode(pTo);
  }

  (void)sqlite3_close(pFile);
  return rc;
}

获得上述函数所需句柄的唯一额外步骤是:

1.从QSqlDatabase获取sqlite-handle

QVariant destVar = database.driver()->handle();

2.检查句柄的有效性并转换为 sqlite3*

if(destVar.isValid() && qstrcmp(destVar.typeName(), "sqlite3*") == 0)
{
    sqlite3* destination = *static_cast<sqlite3 **>(destVar.data());
    ...
}

感谢 CL。 (谁指出了正确的方向)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-24
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多