将内存数据库保存到磁盘

时间:2009-09-17 07:53:27

标签: c++ c database sqlite in-memory

我在c ++中通过sqlite创建了一个数据库。

db已在内存中创建(使用文件名中的“:memory:”参数),以便有非常快速的行为。

数据库由以下行创建:

sqlite3* mem_database;
if((SQLITE_OK == sqlite3_open(":memory:", &mem_database)){
    // The db has been correctly created and
    // I can do some stuff with it.
}
sqlite3_close(mem_database);

我的问题是:如何将内存数据库写入磁盘? (当然是通过c / c ++)。

我读了一些关于ATTACH和DETACH sqlite命令的内容,但我可以让它们只使用sqlite交互式shell(而不是c / c ++代码)。

电贺。

3 个答案:

答案 0 :(得分:20)

答案 1 :(得分:2)

在对表执行任何操作之前使用事务语句。这确保了快速处理和回滚。这样,您就不需要直接在内存中实现数据库了。

答案 2 :(得分:0)

如果您没有足够的时间阅读@NickDandoulakis的答案所发布的全部文档,只需将以下函数(已在链接中提及)复制并粘贴到代码中即可:

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) */

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

,然后用于将SQLite数据库的数据(在内存中)保存到文件调用中:

loadOrSaveDb(db_con, target_file, 1);

db_con是您的数据库连接对象指针,而target_file是目标文件地址。

备注:如果要将SQLite数据库文件加载到内存中,只需运行:

loadOrSaveDb(db_con, target_file, 0);