非常不言自明。我有一个 Room 数据库,其中一个表有一个
String
类型的列,我想获取该列中的所有数据并将其作为 String[]
返回。由于某种原因,String[]
总是空的。我做错了什么?
这是来自我的 DAO 的命令:
@Query("SELECT SubMenuTitle FROM SubMenus WHERE MenuID = :MenuID")
String[] getSubMenus(int MenuID);
当我在手机上使用 sqlite3 二进制文件运行查询时,输出符合预期。
这个答案晚了很多很多年,但我通过将代码更改为类似于以下内容来解决这个问题:
@Query("SELECT SubMenuTitle FROM SubMenus WHERE MenuID = :MenuID")
LiveData<String[]> getSubMenus(int MenuID);
然后,创建ViewModel对象后,
observe()
方法实现如下:
vm.getSubMenus(MenuID).observe(this, new Observer<String[]>() {
@Override
public void onChanged(@Nullable String[] menus) {
populateTabs(menus);
}
});
我的理解是,由于数据库查询需要时间来运行,所以在
getSubMenus()
运行的那一刻,数据库实际上没有返回任何内容。我最初的错误理解是 Room 会等待数据库查询完成运行后再返回对象,但 5 年的进一步研究证明情况并非如此。因此,需要 LiveData<>
包装器,以便 String[]
可以在数据从数据库传入时更新。但是,我可能仍然是错的,所以如果我错了,请有人纠正我。