【问题标题】:sqlite backup memory database c++sqlite 备份内存数据库 c++
【发布时间】:2016-06-20 11:01:46
【问题描述】:

我想在内存中运行一些 sqlite 数据库。

我可以将基于文件的数据库加载到内存数据库中, 我可以备份基于文件的数据库,但失败的是 将内存数据库备份到文件。

我检查了这两个样本,暴露在此处: https://www.sqlite.org/backup.html

我的意思是,我使用了这些示例。 所有 sqlite 函数调用的结果总是 SQLITE_OK,除了 101 对于

sqlite3_backup_step

在第二个例子中。为了确保没有错误,我检查了有表的内存数据库 和数据。情况就是这样。另外,使用相同的备份功能,对文件数据库也很有效。

到目前为止我可以调查,这条线

nSrcPage = (int)sqlite3BtreeLastPage(p->pSrc);

在函数中

sqlite3_backup_step (sqlite3.c)

总是返回 0。所以数据库没有“页面”。

此时基于文件的数据库返回 35。

所以似乎没有副本,因为没有“页面” 给我的记忆数据库;但是这个 mem 数据库肯定有表 和数据。

/// failing backup
bool    backup_test_sqlite_mem2(void)
{
    /// create a file db
    sqlite3*    file_db =create_db("filedb.db",true);
    if(file_db != nullptr)
        sqlite3_close(file_db);

    /// we now have a database file

    /// create an empty mem db
    sqlite3*    mem_db=create_db(":memory:",false);

    /// attached prior created file to mem db
    attach_db_test_sqlite_mem(mem_db,"filedb.db");

    /// check we have content in mem db
    do_select(mem_db, "SELECT count(*) FROM stock","rows in backup_test_sqlite_mem2");

    /// finally back memdb
    int ibackup= backupDb(mem_db,"memdb_from_attached_backup.db",nullptr);

    /// the above backup is empty
    return (ibackup == SQLITE_OK ? true : false);
}

【问题讨论】:

    标签: c++ sqlite backup in-memory


    【解决方案1】:

    内存数据库没有页面,因为它是空的。

    附加的数据库保持独立,即其数据不会合并到备份中。

    要备份附加的数据库,您必须将其名称(而不是“主”)提供给 sqlite3_backup_init()

    【讨论】:

    • 我知道(正如我所描述的它没有页面),但应该是什么结论?我的内存源数据库不是空的(就在备份之前,它创建时插入了 1 个表、5 列和 500 行)但备份是空的:没有表,没有数据。
    猜你喜欢
    • 2011-06-20
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多