Комната - Запрос всей обработки памяти
Я рассматриваю возможность использования библиотеки 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, который вам больше нравится, используйте его. Номер - это опция, а не требование.