Android Room ライブラリをアプリの ORM として使用することを検討していますが、いくつかの制約があり、インターネットで見つけることができなかったため、詳細/コメントを知りたいです (ie.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 がそのシリアル化を処理するという点を無効にします。
乾杯、