Room数据库无法返回group_concat列。

问题描述 投票:0回答:1

我试图在房间里创建一个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 " +
        "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

@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);
}

视图的创建是正确的,但是,在视图上的查询返回所有的组名都是空的。我已经检查了DB浏览器的查询,并在sqlite上运行查询。DB浏览器返回了预期的数据。一个有10条记录的列表,每条记录都是这样的。

|id|  address  |           groupName            |
| 1|youtube.com|videos, entertainment, streaming|

为什么会出现这种情况?room的group_contact有问题吗?这是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();
      }
    });
  }
android sqlite android-sqlite android-room database-view
1个回答
1
投票

的发布 SiteDetailDao_Impl 表明没有生成代码来获取 result-column 的值。group_concat(groupName, ', '). 我猜这是因为它没有简单的名字。 所以,正如 @sergiytikonov 在他的评论中所建议的那样,你需要为该列提供一个别名。 就像这样。

group_concat(groupName, ', ') AS concatName

为了支持新的别名,创建另一个类(你喜欢的名字)。

public class SiteInfo {
    long memberId;
    String address;
    String concatName;
}

然后把你的查询改为 LiveData<List<SiteInfo>>:

@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);
© www.soinside.com 2019 - 2024. All rights reserved.