Import SQLite database using Qt/QSqlDatabase

后端 未结 1 711
时光取名叫无心
时光取名叫无心 2021-01-28 01:50

I have two separate applications, one placed at the production another at an office, and I need to get a copy of an sqlite database generated a

1条回答
  •  醉梦人生
    2021-01-28 02:07

    So finally I was able to reach my goal by using the sqlite backup api (which is distributed as .h and .c with most Qt versions). On the documentation page SQLite Backup there are a few examples, where a database is copied either from a file to an in-memory db, or from an in-memory to a file. In my case I used the following function (1:1 from doc page, only several comments removed):

    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;
    }
    

    The only additional steps to get the handle needed in the function above were:

    1.Get sqlite-handle from QSqlDatabase

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

    2.Check handle for validity and cast to sqlite3*

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

    Thanks to CL. (who was pointing the right direction).

    0 讨论(0)
提交回复
热议问题