Подтвердить что ты не робот

Сохранение на диске базы данных в памяти

Я создал базу данных через 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/С++, конечно).

Я кое-что прочитал о командах sqlite ATTACH и DETACH, но я могу заставить их работать только с интерактивной оболочкой sqlite (а не с кодом c/С++).

Поздравил.

4b9b3361

Ответ 2

Используйте оператор транзакции, прежде чем делать что-либо в таблице. Это обеспечивает быструю обработку и откаты. Таким образом, вам не нужно напрямую реализовывать базу данных в памяти.

Ответ 3

Если у вас недостаточно времени, чтобы прочитать всю документацию, опубликованную ответом @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);