使用Qt / QSqlDatabase导入SQLite数据库

时间:2014-11-19 10:15:09

标签: qt sqlite

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

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

  1. 从生产应用程序中复制整个sqlite文件,并且"重定向"我的QSqlDatabase-处理该文件(无法使其工作,许多连接已经打开,并非全部可以关闭)
  2. 通过网络访问sqlite-db,查询所有数据并使用sql插入缺失的数据(有效,但因为有大量数据需要花费太多时间)
  3. 是否有可能导入或者覆盖现有数据库(甚至单个表,放在不同的文件中),还有打开的连接?

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

1 个答案:

答案 0 :(得分:0)

所以最后我通过使用sqlite备份api(以大多数Qt版本分发为.h和.c)来实现我的目标。在文档页面SQLite Backup上有一些示例,其中数据库从文件复制到内存中的数据库,或从内存复制到文件。在我的情况下,我使用了以下函数(来自doc页面的1:1,只删除了几条注释):

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。 (谁指出了正确的方向)。