Flutter Windows环境ObjectBox异常:实体ID与现有UID不匹配
ObjectBox跨平台(Android/Windows)UID不匹配问题排查与解决
错误核心原因
这个报错本质是Windows本地残留了旧的ObjectBox数据库文件,其存储的实体UID与当前代码中objectbox-model.json定义的UID不匹配。Android设备的数据库是独立存储的(调试时重新安装应用会清空旧数据),所以无冲突;但Windows桌面端的数据库文件会保存在本地文件系统,即使更新了模型文件,旧数据库的UID校验依然会失败。
完整解决步骤
你已完成模型同步、重新生成等操作,缺失的关键步骤是清理Windows本地旧数据库,以下是完整流程:
定位并删除Windows本地数据库文件
- 先在代码中打印数据库存储路径,确认具体位置:
final store = await Store.open(getObjectBoxModel()); print('ObjectBox DB Path: ${store.directory.path}'); - 运行Windows应用,在控制台复制该路径,手动删除路径下的整个
objectbox文件夹。 - 若找不到路径,可直接去用户目录查找:
C:\Users\<你的用户名>\AppData\Roaming\<你的应用名称>,删除其中的数据库文件夹。
- 先在代码中打印数据库存储路径,确认具体位置:
彻底清理缓存与生成文件
- 执行命令确保所有缓存和冲突文件被清理:
flutter clean flutter pub get flutter pub run build_runner clean flutter pub run build_runner build --delete-conflicting-outputs
- 执行命令确保所有缓存和冲突文件被清理:
跨平台一致性保障方案
- 确保
objectbox-model.json在所有平台共享同一文件,放在项目根目录通过版本控制同步,禁止分平台维护。 - 绝对不要手动修改
objectbox-model.json中的UID值,所有实体结构变更(新增字段、修改注解等)后,必须通过build_runner重新生成模型文件,由ObjectBox自动维护UID。 - 开发阶段可临时在初始化Store时添加
removeExisting: true参数(上线前务必移除),避免每次改模型手动删数据库:final store = await Store.open( getObjectBoxModel(), removeExisting: true, // 仅开发环境使用,生产环境禁用 );
- 确保
跨平台差异说明
Android与Windows的ObjectBox数据库存储完全独立:
- Android端数据库默认在应用私有目录,卸载或重装应用会自动清空;
- Windows端数据库存储在用户本地文件系统,除非手动删除,否则旧数据会一直保留,这就是只有Windows出现UID冲突的根本原因。
内容的提问来源于stack exchange,提问作者Thiago Christian
相关产品推荐
相关产品推荐

