Комната - Запрос всей обработки памяти

Я рассматриваю возможность использования библиотеки Android Room в качестве ORM в своем приложении, но я хотел бы узнать больше подробностей / комментариев из-за некоторых ограничений, которые у меня есть, и я не смог найти их в Интернете (т.е.Google;)) Когда я делаю следующий запрос:

@Query("SELECT * FROM users")
List<User> getAll();

и если у меня будут тысячи пользователей, не будет ли это проблемой? потому что из сгенерированного кода ниже кажется, что все загружается в ArrayList. Событие LiveData> или Flowable> делает то же самое.

@Override
public List<User> getAll() {
  final String _sql = "SELECT * FROM Users";
  final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
  final Cursor _cursor = __db.query(_statement);
  try {
   final int _cursorId = _cursor.getColumnIndexOrThrow("id");
   final int _cursorName = _cursor.getColumnIndexOrThrow("name");
   final List<User> _result = new ArrayList<User>(_cursor.getCount());
   while(_cursor.moveToNext()) {
     final User _item;
     final String _tmpMId;
     _tmpMId = _cursor.getString(_cursorId);
     final String _tmpMName;
     _tmpMName = _cursor.getString(_cursorName);
     _item = new User(_tmpMId,_tmpMName);
     _result.add(_item);
   }
   return _result;
  } finally {
   _cursor.close();
   _statement.release();
  }
}

@Override
  public Flowable<List<User>> getAllRX() {
    final String _sql = "SELECT * FROM Users";
    final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
    return RxRoom.createFlowable(__db, new String[]{"Users"}, new Callable<List<CachedAttendee>>() {
      public List<User> call() throws Exception {
        final Cursor _cursor = __db.query(_statement);
        try {
          final int _cursorId = _cursor.getColumnIndexOrThrow("id");
          final int _cursorName = _cursor.getColumnIndexOrThrow("name");
          final List<User> _result = new ArrayList<User>(_cursor.getCount());
          while(_cursor.moveToNext()) {
            final User _item;
            final String _tmpMId;
            _tmpMId = _cursor.getString(_cursorId);
            final String _tmpMName;
            _tmpMName = _cursor.getBlob(_cursorName);
            _item = new User(_tmpMId,_tmpMName);
            _result.add(_item);
          }
          return _result;
        } finally {
          _cursor.close();
        }
      }

      @Override
      protected void finalize() {
        _statement.release();
      }
    });
  }

Я смотрю на это неправильно, или Google отклонил этот пункт? Я всегда могу использовать курсоры, но это лишает меня смысла иметь ORM, обрабатывающий эту сериализацию для меня.

Ура,

2 ответа

Вы можете рассмотреть нумерацию страниц, чтобы улучшить эту проблему.

Запрос это:

@Query("SELECT * FROM user LIMIT :limit OFFSET :offset")
    User[] loadAllUsersByPage(int limit,int offset);

Здесь он выдаст список пользователей на основе лимита и смещения.

если loadAllUsersByPage(2,0) он вернет первые 2 строки из таблицы.

если loadAllUsersByPage(2,1) он вернет 3 и 4 строки из таблицы.

но если loadAllUsersByPage(-1,10) затем он будет обслуживать первые 10 строк из таблицы.

Спасибо:)

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

Вы просили это сделать это. Если вы не хотите List из всех пользователей, не просите об этом. Создать @Query который использует какие-то ограничения (например, WHERE, LIMIT/OFFSET).

Это существенно не отличается от других решений ORM. При этом, если вы найдете какой-то другой ORM, который вам больше нравится, используйте его. Номер - это опция, а не требование.

Другие вопросы по тегам