不言自明。我有一个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[]
。但是,我可能仍然错了,所以如果我错了,请有人纠正我。