Android 房间数据库无法返回组\u concat列
我试图在房间中创建一个DatabaseView,以便从多个表中获取所需的数据。这是我的数据库视图:Android 房间数据库无法返回组\u concat列,android,sqlite,android-sqlite,android-room,database-view,Android,Sqlite,Android Sqlite,Android Room,Database View,我试图在房间中创建一个DatabaseView,以便从多个表中获取所需的数据。这是我的数据库视图: @DatabaseView("SELECT site.name AS address, group_site.name AS groupName, group_site.member_id AS memberId " + "FROM site, group_site " + "INNER JOIN groupsite_join_site " + "O
@DatabaseView("SELECT site.name AS address, group_site.name AS groupName, group_site.member_id AS memberId " +
"FROM site, group_site " +
"INNER JOIN groupsite_join_site " +
"ON site.id = groupsite_join_site.site_id AND group_site.id = groupsite_join_site.group_site_id " +
"UNION SELECT preloaded_site.name AS address, preloaded_group_site.name AS groupName, preloaded_group_site.memberId AS memberId " +
"FROM preloaded_site, preloaded_group_site " +
"INNER JOIN preloaded_groupsite_join_site ON preloaded_site.id = preloaded_groupsite_join_site.site_id AND preloaded_site.id = preloaded_groupsite_join_site.site_id"
)
public class SiteDetail {
long memberId;
String address;
String groupName;
}
这是我的刀:
@Dao
public interface SiteDetailDao {
@Query("SELECT address, group_concat(groupName, ', '), memberId FROM sitedetail WHERE memberId = :memberId OR memberId = -1 GROUP BY address LIMIT 10")
LiveData<List<SiteDetail>> getSiteDetailForMember(long memberId);
}
为什么会发生这种情况?房间与小组联络有任何问题吗?这是SiteDetailDao_Impl:
@Override
public LiveData<List<SiteDetail>> getSiteDetailForMember(final long memberId) {
final String _sql = "SELECT address, group_concat(groupName, ', '), memberId FROM sitedetail WHERE memberId = ? OR memberId = -1 GROUP BY address LIMIT 10";
final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 1);
int _argIndex = 1;
_statement.bindLong(_argIndex, memberId);
return __db.getInvalidationTracker().createLiveData(new String[]{"sitedetail"}, false, new Callable<List<SiteDetail>>() {
@Override
public List<SiteDetail> call() throws Exception {
final Cursor _cursor = DBUtil.query(__db, _statement, false);
try {
final int _cursorIndexOfAddress = CursorUtil.getColumnIndexOrThrow(_cursor, "address");
final int _cursorIndexOfMemberId = CursorUtil.getColumnIndexOrThrow(_cursor, "memberId");
final List<SiteDetail> _result = new ArrayList<SiteDetail>(_cursor.getCount());
while(_cursor.moveToNext()) {
final SiteDetail _item;
_item = new SiteDetail();
final String _tmpAddress;
_tmpAddress = _cursor.getString(_cursorIndexOfAddress);
_item.setAddress(_tmpAddress);
final long _tmpMemberId;
_tmpMemberId = _cursor.getLong(_cursorIndexOfMemberId);
_item.setMemberId(_tmpMemberId);
_result.add(_item);
}
return _result;
} finally {
_cursor.close();
}
}
@Override
protected void finalize() {
_statement.release();
}
});
}
@覆盖
公共LiveData GetSiteDetailFormMember(最终长成员ID){
最后一个字符串_sql=“选择地址、组地址(groupName,,”)、memberId FROM sitedetail,其中memberId=?或memberId=-1按地址限制10分组”;
final-RoomSQLiteQuery _语句=RoomSQLiteQuery.acquire(_-sql,1);
int _argIndex=1;
_语句.bindLong(_argIndex,memberId);
返回_db.getInvalizationTracker().createLiveData(新字符串[]{“sitedetail”},false,新可调用(){
@凌驾
公共列表调用()引发异常{
final Cursor\u Cursor=DBUtil.query(\u db,\u语句,false);
试一试{
final int _cursorIndexOfAddress=CursorUtil.getColumnIndexOrThrow(_cursor,“address”);
final int _cursorIndexOfMemberId=CursorUtil.getColumnIndexOrThrow(_cursor,“memberId”);
最终列表_result=newarraylist(_cursor.getCount());
while(_cursor.moveToNext()){
最终站点详细信息_项;
_item=新站点详细信息();
最后一个字符串\u tmpAddress;
_tmpAddress=\u cursor.getString(\u cursorIndexOfAddress);
_项目.设置地址(_tmpAddress);
最终长成员;
_tmpMemberId=\u cursor.getLong(\u cursorIndexOfMemberId);
_item.setMemberId(_tmpMemberId);
_结果.添加(_项);
}
返回结果;
}最后{
_cursor.close();
}
}
@凌驾
受保护的void finalize(){
_声明.发布();
}
});
}
发布sitedaildao\u Impl
表明,生成代码不是为了获取结果列group\u concat(groupName,,')的值。
。我猜这是因为它没有简单的名字。因此,正如@sergiytikonov在其评论中所建议的,您需要为该专栏提供一个别名。比如:
group_concat(groupName, ', ') AS concatName
要支持新别名,请创建另一个类(根据需要命名):
并将查询更改为返回LiveData
:
@Query(“从sitedetail中选择地址、组_concat(groupName,,”)作为concatName、memberId”+
“其中memberId=:memberId或memberId=-1按地址分组限制10”)
LiveData GetSiteDetailFormMember(长成员ID);
您是否查看了RoomSiteDetailDao\u Impl.java自动生成的内部信息?也许你会从那里的方法getSiteDetailFormMember
实现中得到一些线索。用SiteDetailDao\u Impl更新了这个问题,其中没有groupName的标志。@sergiytikhonov在DBUtil.query(\uu db,\u语句,false,null)的行中代码>出现错误:应为3个参数,但找到4个。可能不是这样,但请尝试将…group_concat(groupName,,')作为groupName,…
@sergiytikhonov谢谢。这个问题按照你的建议解决了。
group_concat(groupName, ', ') AS concatName
public class SiteInfo {
long memberId;
String address;
String concatName;
}
@Query("SELECT address, group_concat(groupName, ', ') AS concatName, memberId FROM sitedetail'" +
" WHERE memberId = :memberId OR memberId = -1 GROUP BY address LIMIT 10")
LiveData<List<SiteInfo>> getSiteDetailForMember(long memberId);