База данных комнаты, как реализовать элемент, которому нужны столбцы из 2-х сущностей - PullRequest
0 голосов
/ 12 октября 2019

Я создал базу данных с Room с MVVM, и я столкнулся с проблемой, надеюсь, вы могли бы помочь мне решить эту проблему.

У меня есть база данных, содержащая 3 объекта Player, Group иStandings, где Standings - это соотношение между Player и Group. Дело в том, что я хочу представить турнирную таблицу, но Standings содержит только идентификаторы Group и Player, и я хочу, чтобы он также показывал имя игрока, который находится в Player, и яиспользуя LiveData, adapters и ViewModels, поэтому, когда я возвращаю список LiveData<List<Standings>> для наблюдения, он не содержит имени игрока.

Кто-то знает, какЯ также могу передать имя?

Единственное решение, о котором я могу подумать, - это создать новый класс, в котором в качестве экземпляров будут стоять Standing и имя (String), а затем вернуть его для наблюдения.

Но это не кажется естественным, поэтому я подумал, что смогу найти лучшее, более элегантное решение.

     groupStandingsViewModel = ViewModelProviders.of(this, new GroupStandingsViewModelFactory(this.getApplication(), 0)).get(GroupStandingsViewModel.class);
    groupStandingsViewModel.getAllStandings().observe(this, new Observer<List<Standings>>() {
        @Override
        public void onChanged(List<Standings> standings) {
            adapter.setStanding(standings);
        }
    });

Я ожидаю, что смогу иметь как турнирную таблицу, так иимена, данные в функции onChanged наблюдения.

1 Ответ

0 голосов
/ 13 октября 2019

Единственное решение, о котором я могу подумать, - это создать новый класс, в котором в качестве экземпляров будут стоять Standing и имя (String), а затем вернуть его для наблюдения.

Но это не такчувствую себя естественно, поэтому я подумал, что смогу найти здесь лучшее, более элегантное решение.

Это может звучать неестественно, но вам понадобится новый код, и что еще? (PS это риторический).

Я бы предложил, чтобы новый класс был способом, но что-то вроде: -

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

Это может быть использовано вместе с Дао-запросом по линиииз: -

@Query("SELECT * FROM standings JOIN player ON mapToPlayer = playerId JOIN `group` ON mapToGroup = groupId")
List<PlayerGroupStanding> getAllStandingsWithPlayerAndGroupDetails();
  • Обратите внимание, что вышеизложенное делает много предположений относительно имен, хотя указанные имена должны быть самообъяснимыми.
  • Обратите внимание, что имена переменных, например, playerNameдолжно совпадать с именем столбца, полученным из запроса.

Дополнительно

Комментарий

какой объект возвращает SELECT в запросе. Я понимаю, что если я использую SELECT *, то объект будет из класса, который находится в FROM. но когда я возвращаю столбцы, что будет объектом, который мне нужно упомянуть в LiveData>? Где можно найти информацию об этом? Заранее большое спасибо: D

SELECT фактически возвращает курсор, это аннотация, которая затем записывает код, который извлекает столбцы в соответствии с определением метода, отображающего столбцы в соответствии с классом. имена членов для возврата объекта, если дополнительные столбцы существуют, они игнорируются. Предложение FROM не определяет, что результирующий объект возвратил метод после того, как @Query выполняет в соответствии с типом, возвращаемым этим методом.

Фактический код можно найти после построения (Ctrl + F9) в сгенерированном коде. проекта, например

enter image description here

Таким образом, для приведенного выше примера соответствующий метод, который генерируется в коде Дао (то есть суффикс Дао с _impl):-

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