android - 房间用旧数据膨胀数据库
问题描述
我正在尝试在第一次加载应用程序时自动填充数据库。我正在尝试从本地副本“膨胀”数据库,如下所示:
public static synchronized bDB getInstance(Context context) {
if(bDB == null) {
Log.v("Hello", "Inflating database.");
bDB = Room.databaseBuilder(context.getApplicationContext(), BDB.class, databaseName)
.createFromAsset("database/bdb.db")
.fallbackToDestructiveMigration()
.build();
}
return bDB;
}
我注意到初始文件中有一个错误(数据错误,架构保持不变)。我更正了它并更新了文件'bdb.db'。但是,每次预填充数据库时,它总是会拾取旧的错误数据。我尝试了以下方法:
- 清除所有缓存并使其无效。
- 清理并重建。
- 检查数据库文件一百万次。
虽然资产文件夹中的文件是正确的,但它从哪里获取旧数据?
任何帮助都是最受欢迎的。
解决方案
根据评论中的讨论,您似乎被auto-backup咬了。使用 Room,由于架构更改,这更典型地表现为“无法验证数据完整性”错误 - 在您的情况下,架构是相同的,但数据不同。
您可以配置自动备份,包括禁用它(如您所做的那样,设置android:allowBackup
为false
)或控制备份哪些文件(使用android:fullBackupContent
)。而且,您可以在每个构建变体的基础上执行此操作,例如为 adebug
或release
构建设置不同的值:
- 对于
android:allowBackup
,您应该能够指向一个布尔资源,在main
和中具有不同的值debug
- 对于
android:fullBackupContent
,您可以在不同的 XML 资源中main
使用debug
不同的规则
推荐阅读
- events - 如何在 python 对象和 ipywidget 之间进行双向链接
- assembly - x86 XOR 操作码差异
- redis - 将 Kubernetes Pod 中的数据写入主机
- node.js - 如何在 node.js lambda 函数中进行同步 DDB 查询?
- ios - iOS 如何在前台显示本地通知?
- c++ - 为什么 C++ const 引用可以折叠成非 const 引用
- python-3.x - webdriver.Chrome() 不工作
- java - 将整数拆分为单独的部分
- c - 使用 execle 和 putenv 后跟 execl 有什么区别?
- ios - 如何将阴影添加到 UIImageView 本身而不是其图层