房间 - 查询所有内存处理

时间:2017-06-28 14:56:11

标签: android performance android-room android-orm

我正在考虑在我的应用程序中使用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为我处理序列化。

干杯,

2 个答案:

答案 0 :(得分:2)

  

如果我有数千名用户,那么这不是一个问题吗?因为从下面生成的代码看来它似乎将所有内容加载到ArrayList中。

你要求它这样做。如果您不想要List所有用户,请不要求它。创建使用某种约束的@Query(例如WHERELIMIT / 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行。

谢谢:)