使用Qt/QSqlDatabase导入SQLite数据库

使用Qt/QSqlDatabase导入SQLite数据库,qt,sqlite,Qt,Sqlite,我有两个独立的应用程序,一个放在生产中,另一个放在办公室,我需要得到一个副本在生产端生成和更新sqlite数据库 到目前为止,我已经尝试了两种方法: 从生产应用程序复制整个sqlite文件,并将我的QSqlDatabase句柄“重定向”到该文件(无法使其正常工作,许多连接已打开,但并非所有连接都可关闭) 通过网络访问sqlite数据库,查询所有数据,并使用sql插入缺少的数据(工作正常,但由于数据太多,需要花费太多时间) 是否有可能导入或覆盖仍存在打开连接的现有数据库(甚至是放置在不同文件中的单

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

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

  • 从生产应用程序复制整个sqlite文件,并将我的QSqlDatabase句柄“重定向”到该文件(无法使其正常工作,许多连接已打开,但并非所有连接都可关闭)
  • 通过网络访问sqlite数据库,查询所有数据,并使用sql插入缺少的数据(工作正常,但由于数据太多,需要花费太多时间)
  • 是否有可能导入覆盖仍存在打开连接的现有数据库(甚至是放置在不同文件中的单个表)


    使用:qt4.8、SQLite、windows7、VS2010,所以我最终能够通过使用SQLite备份api(在大多数Qt版本中以.h和.c的形式分发)实现我的目标。在文档页面上有几个示例,其中数据库要么从文件复制到内存中的db,要么从内存中的db复制到文件。在我的例子中,我使用了以下功能(从文档页面1:1,仅删除了几个注释):

    获取上述函数中所需句柄的唯一附加步骤是:

    1.从QSqlDatabase获取sqlite句柄

    QVariant destVar = database.driver()->handle();
    
    2.检查句柄的有效性并转换为sqlite3*

    if(destVar.isValid() && qstrcmp(destVar.typeName(), "sqlite3*") == 0)
    {
        sqlite3* destination = *static_cast<sqlite3 **>(destVar.data());
        ...
    }
    
    if(destVar.isValid()&&qstrcmp(destVar.typeName(),“sqlite3*”==0)
    {
    sqlite3*destination=*静态_转换(destVar.data());
    ...
    }
    

    感谢CL.(指向正确的方向)。

    将文件复制到本地临时目录,然后使用备份API替换数据库。由于备份原因,文件已被复制。。。我们将尽快查看备份api,并在此处留下反馈!Thanks@CL.工作起来很有魅力!谢谢你的提示。加上它作为答案,我会投票并接受它:-)你可以自己回答。
    if(destVar.isValid() && qstrcmp(destVar.typeName(), "sqlite3*") == 0)
    {
        sqlite3* destination = *static_cast<sqlite3 **>(destVar.data());
        ...
    }