我尝试在Android应用程序中使用OrmLite,遇到了问题:
我在一个对象上创建了一个外部集合,并为它分配了一些对象。我可以使用DAO上的queryForAll()方法来查询对象,并按预期返回它们:
allTeams = getHelper().getTeamDao().queryForAll();
for(ScrumTeam team : allTeams) {
if(team.getMembers() == null || team.getMembers().size() == 0) {
log("No Members");
} else {
log(team.getMembers().size()+" Members");
}
}
这符合预期,在团队中打印“2名成员”或“3名成员”,代表正确的数据。
显然,我想对数据进行排序,我发现这样做的方法是使用queryBuilder:
allTeams = getHelper().getTeamDao().queryBuilder().selectColumns("id", "name").orderBy("name", true).query();
for(ScrumTeam team : allTeams) {
if(team.getMembers() == null || team.getMembers().size() == 0) {
log("No Members");
} else {
log(team.getMembers().size()+" Members");
}
}
上面的代码输出“No members”,但我可以完美地访问团队的其他数据(id和name)。我试着在集合上设置真假,但都没有效果。进一步调查,我发现,成员数组没有初始化(null)。这是一个错误,还是我错误地使用了库?有没有办法手动获取ForeigCollection?
感谢您的回复!
答案 0 :(得分:2)
有趣。问题是您已将列限制为"id"
和"name"
。因此,ORMLite不会为您创建ForeignCollection
字段。
这是在版本4.30中修复的错误。我们添加了在ForeignCollection
中指定selectColumns()
列名称的功能。以下是解决此问题的错误:
https://sourceforge.net/tracker/?func=detail&aid=3428751&group_id=297653&atid=1255989
您需要修改QueryBuilder
代码以“选择”members
字段。
...selectColumns("id", "name", "members")...
以下是selectColumns()
方法的文档:
引用:
警告:如果指定要返回的任何列,则除非其ForeignCollectionField.columnName也在列表中,否则任何外部集合字段都将返回为null。