32

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

问候。

4

3 回答 3

28

查看此示例:加载和保存内存数据库

于 2009-09-17T08:01:10.460 回答
0

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

于 2009-09-17T08:03:53.647 回答
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);
于 2019-10-10T15:03:56.360 回答