会议室数据库如何实现需要来自2个实体的列的项目

时间:2019-10-12 14:10:05

标签: android android-recyclerview android-room dao android-livedata

我已经用Room和MVVM创建了数据库,但是我遇到了一个问题,希望您能帮助我解决这个问题。

我有一个包含3个实体function onEdit(e) { if (typeof e.value != 'object') { if ([4, 5].indexOf(e.range.columnStart)<0) return; e.range.setValue(titleCase(e.value)); } } function titleCase(str) { return str.toString().split(/\b/).map(function(word) { return word ? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() : ''; }).join(''); } PlayerGroup的数据库,其中排名是StandingsPlayer之间的关系。 问题是我想展示排名,但是Group仅包含StandingsGroup的ID,并且我希望它还显示{{ 1}},而我使用的是PlayerPlayerLiveData,因此当我返回要观察的adapters列表时,它不包含名称播放器。

有人知道我也可以通过这个名字吗?

我唯一想到的解决方案是创建一个新的类,该类具有一个Standing和名称(String)作为实例,然后将其返回以进行观察。

但这并不自然,所以我想我可以在这里找到一个更好,更优雅的解决方案。

ViewModels

我希望能够同时拥有观察者的LiveData<List<Standings>>功能中给出的排名和名称。

1 个答案:

答案 0 :(得分:0)

  

我唯一想到的解决方案是创建一个新类,   有一个Standing和名称(字符串)作为实例,然后返回   它可以观察。

     

但这并不自然,所以我想我可以在这里找到更好的选择,   更优雅的解决方案。

听起来不自然,但是您将需要一些新代码,还有什么呢? (附言说)。

我建议您上一门新课,但是类似:-

public class PlayerGroupStanding {

    @Embedded
    Standings standing;
    String playerName;
    long playerId;
    String groupName;
    long groupId;

    public PlayerGroupStanding() {
    }

    public Standings getStanding() {
        return standing;
    }

    public void setStanding(Standings standing) {
        this.standing = standing;
    }

    public long getPlayerId() {
        return playerId;
    }

    public void setPlayerId(long playerId) {
        this.playerId = playerId;
    }

    public String getPlayerName() {
        return playerName;
    }

    public void setPlayerName(String playerName) {
        this.playerName = playerName;
    }

    public long getGroupId() {
        return groupId;
    }

    public void setGroupId(long groupId) {
        this.groupId = groupId;
    }

    public String getGroupName() {
        return groupName;
    }

    public void setGroupname(String groupname) {
        this.groupName = groupname;
    }
}

这可以与Dao Query结合使用:-

@Query("SELECT * FROM standings JOIN player ON mapToPlayer = playerId JOIN `group` ON mapToGroup = groupId")
List<PlayerGroupStanding> getAllStandingsWithPlayerAndGroupDetails();
  • 请注意,尽管给定的名称应该是自言自语的,但上面对名称的假设还是很多的。
  • 请注意,变量名称例如playerName应该与查询返回的列名匹配。

其他

评论

  SELECT在查询中返回的对象是什么。我知道,如果我使用SELECT *,则该对象将属于FROM中的类。但是当我返回列时,在LiveData>中需要提及的对象是什么?如果在哪里可以找到有关它的信息?预先非常感谢:D

SELECT实际上返回一个游标,它是注释,然后编写代码,根据类的成员名根据映射列的方法的定义提取列以返回对象,如果存在其他列,则将其忽略。在@Query根据该方法返回的类型执行操作之后,FROM子句无法确定该方法返回的结果对象。

在构建(Ctrl + F9)之后,可以在项目的生成代码中找到实际代码,例如

enter image description here

因此对于上面的示例,则在Dao的代码(即_impl后缀为Dao的代码)中生成的相应方法为:-

@Override
  public List<PlayerGroupStandings> getAllPlayerGroupStandings() {
    final String _sql = "SELECT * FROM standings JOIN player ON mapToPlayer = playerId JOIN `group` ON mapToGroup = groupId";
    final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
    __db.assertNotSuspendingTransaction();
    final Cursor _cursor = DBUtil.query(__db, _statement, true, null);
    try {
      final int _cursorIndexOfMapToPlayer = CursorUtil.getColumnIndexOrThrow(_cursor, "mapToPlayer");
      final int _cursorIndexOfMapToGroup = CursorUtil.getColumnIndexOrThrow(_cursor, "mapToGroup");
      final LongSparseArray<ArrayList<Player>> _collectionPlayers = new LongSparseArray<ArrayList<Player>>();
      final LongSparseArray<ArrayList<Group>> _collectionGroup = new LongSparseArray<ArrayList<Group>>();
      while (_cursor.moveToNext()) {
        if (!_cursor.isNull(_cursorIndexOfMapToPlayer)) {
          final long _tmpKey = _cursor.getLong(_cursorIndexOfMapToPlayer);
          ArrayList<Player> _tmpPlayersCollection = _collectionPlayers.get(_tmpKey);
          if (_tmpPlayersCollection == null) {
            _tmpPlayersCollection = new ArrayList<Player>();
            _collectionPlayers.put(_tmpKey, _tmpPlayersCollection);
          }
        }
        if (!_cursor.isNull(_cursorIndexOfMapToGroup)) {
          final long _tmpKey_1 = _cursor.getLong(_cursorIndexOfMapToGroup);
          ArrayList<Group> _tmpGroupCollection = _collectionGroup.get(_tmpKey_1);
          if (_tmpGroupCollection == null) {
            _tmpGroupCollection = new ArrayList<Group>();
            _collectionGroup.put(_tmpKey_1, _tmpGroupCollection);
          }
        }
      }
      _cursor.moveToPosition(-1);
      __fetchRelationshipplayerAsarmAndroidroommigrationsPlayer(_collectionPlayers);
      __fetchRelationshipgroupAsarmAndroidroommigrationsGroup(_collectionGroup);
      final List<PlayerGroupStandings> _result = new ArrayList<PlayerGroupStandings>(_cursor.getCount());
      while(_cursor.moveToNext()) {
        final PlayerGroupStandings _item;
        final Standings _tmpStandings;
        if (! (_cursor.isNull(_cursorIndexOfMapToPlayer) && _cursor.isNull(_cursorIndexOfMapToGroup))) {
          _tmpStandings = new Standings();
          final Long _tmpMapToPlayer;
          _tmpMapToPlayer = _cursor.getLong(_cursorIndexOfMapToPlayer);
          _tmpStandings.setMapToPlayer(_tmpMapToPlayer);
          final Long _tmpMapToGroup;
          _tmpMapToGroup = _cursor.getLong(_cursorIndexOfMapToGroup);
          _tmpStandings.setMapToGroup(_tmpMapToGroup);
        }  else  {
          _tmpStandings = null;
        }
        ArrayList<Player> _tmpPlayersCollection_1 = null;
        if (!_cursor.isNull(_cursorIndexOfMapToPlayer)) {
          final long _tmpKey_2 = _cursor.getLong(_cursorIndexOfMapToPlayer);
          _tmpPlayersCollection_1 = _collectionPlayers.get(_tmpKey_2);
        }
        if (_tmpPlayersCollection_1 == null) {
          _tmpPlayersCollection_1 = new ArrayList<Player>();
        }
        ArrayList<Group> _tmpGroupCollection_1 = null;
        if (!_cursor.isNull(_cursorIndexOfMapToGroup)) {
          final long _tmpKey_3 = _cursor.getLong(_cursorIndexOfMapToGroup);
          _tmpGroupCollection_1 = _collectionGroup.get(_tmpKey_3);
        }
        if (_tmpGroupCollection_1 == null) {
          _tmpGroupCollection_1 = new ArrayList<Group>();
        }
        _item = new PlayerGroupStandings();
        _item.standings = _tmpStandings;
        _item.players = _tmpPlayersCollection_1;
        _item.group = _tmpGroupCollection_1;
        _result.add(_item);
      }
      return _result;
    } finally {
      _cursor.close();
      _statement.release();
    }
  }