【发布时间】:2020-06-27 13:04:10
【问题描述】:
在恢复屏幕中,我从谷歌驱动器恢复我的 sqlite db(房间数据库)文件。 回到我的主要活动后 - recyclerview 显示缓存的数据,而不是显示新恢复的数据库数据。
我尝试在主要活动中再次初始化我的 ViewModel - 但这没有帮助。
@Override
protected void onResume() {
super.onResume();
setupViewModel(); // re-initialising my ViewModel
Toast.makeText(this, "Your expenses have been restored", Toast.LENGTH_SHORT).show();
}
如果我在恢复后重新启动我的应用程序,我可以在主要活动中看到恢复的数据库中的数据。
任何帮助将不胜感激。 我现在的解决方法是 - 我可以要求用户在他们从谷歌驱动器恢复数据库后重新启动应用程序。
更新:
private void setupViewModel() {
//Associate ViewModel to this activity
ItemViewModel itemViewModel = new ViewModelProvider(this).get(ItemViewModel.class);
itemViewModel.getItems().observe(this, new Observer<List<Item>>() {
@Override
public void onChanged(List<Item> items) {
ItemsActivity.this.items = items;
itemsAdaptor.setItems(items);
}
});
}
【问题讨论】:
-
您是否在恢复备份之前关闭了数据库?恢复备份后是否重新打开数据库?你在做一些重新查询数据库的事情吗?您是否正在做一些事情来将这些查询结果发送到您的
RecyclerView? -
@CommonsWare - 是的,我更新了 setupViewModel 的代码,它调用 getItems 从数据库中查询所有数据。这里的问题是,只有在项目列表发生变化时才会调用 getItems。替换db文件不是调用onChanged方法。
-
您是否在恢复备份之前关闭了数据库?恢复备份后是否重新打开数据库?你在做一些重新查询数据库的事情吗?因为,从您那里的代码来看,您似乎没有做任何这些事情。在恢复之前关闭数据库。恢复后重新打开数据库。这将迫使您重新查询数据库,因为您现在有一个新的
RoomDatabase对象和新的 DAO 对象。 -
@CommonsWare - 是的,我关闭了现有数据库(也检查了 db.isOpen() 是否首先)并调用了我的房间存储库以再次打开数据库。但是这里的问题是项目列表存储在缓存中(根据带有 Room 数据库的 MVVM 设计),即使发生重新查询,该列表也没有得到更新。谢谢你的帮助。我在想除了在 Room 数据库中关闭/重新打开数据库之外是否存在任何方法来反映替换的数据库数据。
-
“但这里的问题是项目列表存储在缓存中”——Room 没有这样做。你正在这样做。因此,您需要在恢复数据库后重新查询数据库并更新缓存。 “即使发生重新查询,该列表也没有更新” - 我猜你的缓存代码中有一个错误。 “我在想是否存在除了关闭/重新打开 Room 数据库中的数据库以反映替换的数据库数据之外的任何方法” - 无论缓存如何,关闭和重新打开数据库都是必要的。永远不要打开您用其他文件替换的文件的句柄。
标签: android android-recyclerview android-room android-mvvm