繁体   English   中英

将内存数据库保存到磁盘

[英]Saving to disk an in-memory database

我在 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++ 代码)。

问候。

看看这个例子:加载和保存内存数据库

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM