我正在考虑在我的应用程序中使用Android Room库作为ORM,但我想知道更多细节/评论,因为我有一些限制,我无法在互联网上找到(即.Google; )) 当我执行以下查询时:
@Query("SELECT * FROM users")
List<User> getAll();
如果我有数千名用户,那不是一个问题吗?因为从生成的代码,它似乎将所有内容加载到ArrayList中。事件LiveData&gt;或流动的&gt;做同样的事。
@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驳回了这一点?我总是可以使用Cursors,但是这样就无法让ORM为我处理序列化。
干杯,
答案 0 :(得分:2)
如果我有数千名用户,那么这不是一个问题吗?因为从下面生成的代码看来它似乎将所有内容加载到ArrayList中。
你要求它这样做。如果您不想要List
所有用户,请不要求它。创建使用某种约束的@Query
(例如WHERE
,LIMIT
/ OFFSET
)。
这与其他ORM解决方案没有显着差异。话虽如此,如果您发现其他一些您更喜欢的ORM,请使用它。房间是一种选择,不是要求。
答案 1 :(得分:1)
您可以考虑分页以改善此问题。
查询是:
@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行。
谢谢:)