如何基于磁盘文件初始化ObjectBox 4 C++内存数据库?
ObjectBox内存数据库初始化与ID序列问题
问题描述
我已创建ObjectBox数据库并将记录写入base/data.mdb的表中,需要在另一程序中将该数据库加载至ObjectBox内存实例。
尝试直接创建Store并指定目录的方式无效:
store_(obx::Options(create_obx_model()).directory("memory:/databasePath"))
我尝试先创建临时Store再复制数据到内存数据库:
tempStore_(obx::Options(create_obx_model()).directory("path/to/base")) obx::Box<Object> tableTemp(tempStore_); memStore_(obx::Options(create_obx_model()).directory("memory:/databasePath")) obx::Box<Object> tableObject(memStore_); auto all = tableTemp.getAll(); tableObject.put(all);
但出现错误:
what(): ID is higher or equal to internal ID sequence: 3 (vs. 1). Use ID 0 (zero) to insert new objects.
请问是否可直接基于文件初始化内存数据库?能否修改内存库内部ID序列以匹配磁盘库最大ID,而非通过增删虚拟对象提升序列?
解决方案
1. 直接基于文件初始化内存数据库
可以直接基于磁盘文件初始化内存数据库,推荐使用ObjectBox的备份恢复机制实现,完整复制磁盘库的所有数据(包括ID序列),无需手动处理ID问题:
// 打开磁盘数据库 obx::Store diskStore(obx::Options(create_obx_model()).directory("path/to/base")); // 创建内存数据库实例 obx::Store memStore(obx::Options(create_obx_model()).directory("memory:/target-db")); // 将磁盘数据库的数据完整恢复到内存数据库 diskStore.backupTo(memStore.directory());
2. 修改内存库的内部ID序列
如果需要保留原有数据复制逻辑,可以直接修改内存库的ID序列,使其匹配磁盘库的最大ID,无需增删虚拟对象:
// 1. 获取磁盘库中目标表的最大ID auto maxId = tableTemp.maxId(); // 2. 获取内存库中对应表的序列实例 obx_sequence* seq = obx_store_sequence( memStore.ptr(), obx_model_entity_id(create_obx_model(), "Object") // 替换为你的实体类名称 ); // 3. 将序列当前值设置为磁盘库的最大ID obx_sequence_set_current(seq, maxId); // 4. 释放序列指针 obx_sequence_close(seq); // 此时再执行数据复制就不会报错 auto all = tableTemp.getAll(); tableObject.put(all);
如果不需要保留原有ID,也可以在复制时将每个对象的ID设为0,让ObjectBox自动分配新ID,但这种方式会改变原有数据的ID标识。
内容的提问来源于stack exchange,提问作者Otto Lewis
相关产品推荐
相关产品推荐

