我有两个单独的应用程序,一个位于办公室的另一个应用程序中,我需要在生产端生成并更新 一个 sqlite数据库的副本
到目前为止,我已尝试了两个方法:
是否有可能导入或者覆盖现有数据库(甚至单个表,放在不同的文件中),还有打开的连接?
使用:Qt 4.8,SQLite,Windows 7,VS2010
答案 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。 (谁指出了正确的方向)。