将内存数据库保存到磁盘

33

我用C++通过sqlite创建了一个数据库。

这个数据库是在内存中创建的(使用":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个回答

31

我正在寻找用于同一目的的C#文档。如果您知道,请分享。 - Mubashar
@Mubashar:我不熟悉C#,但我相信将示例转换为C#很容易。sqlite3_backup_X函数可以完成这项工作。 - Nick Dandoulakis
重定向到URL是stackoverflow的不好的答案。 - iperov

2

如果您没有足够的时间阅读@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);

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接