做OrmLite& greenDAO在后台线程中执行查询并将结果部分加载到内存中吗?

时间:2014-06-05 09:21:27

标签: android orm ormlite greendao

为了避免阻塞主/ UI线程,Android API提供了Loader来访问数据库。为了节省内存(RAM),API不会将整行(结果)加载到内存中,因此我们可以让ListView包含这么多项而不会出现内存。

OrmLite& greenDAO提供了这两种功能吗?如果没有,是否有任何方法可以进行异步查询和部分加载和交换,以便将巨大的数据填充到ListView

2 个答案:

答案 0 :(得分:0)

我认为ORM框架不能仅加载行部分。

使用greendao,您可以使用listLazy()上的Query从数据库懒洋洋地加载实体。与“预取”所有实体相比,这会带来很大的性能优势。

我知道greendao还提供了一些用AsyncSession异步加载实体的方法。但我目前不知道如何使用它。

通常,greendao中的所有CRUD操作都发生在调用update等的同一个线程上。

我还没有使用过OrmLite,所以我没有关于此的信息。

答案 1 :(得分:0)

我无法通过OrmLite发音但是使用greenDAO我知道你可以在db上执行原始查询。毕竟,所有生成的代码都在于SQLITE数据库。

查看greenDAO示例项目中的NoteActivity: https://github.com/greenrobot/greenDAO/blob/master/DaoExample/src/main/java/de/greenrobot/daoexample/NoteActivity.java

在onCreate()中,您可以清楚地看到光标是这样获取的:

  

DevOpenHelper helper = new DaoMaster.DevOpenHelper(this," db_name",null);
  SQLiteDatabase db = helper.getWritableDatabase();
  DaoMaster daoMaster =新DaoMaster(db);
  DaoSession daoSession = daoMaster.newSession();   ObjectDao objectDao = daoSession.getObjectDao();
  [..]
  游标cursor = db.query(objectDao.getTablename(),objectDao.getAllColumns(),null,null,null,null,null);

如您所见,此光标可用作显示数据的任何其他光标。 现在,在主线程上执行此操作是错误的,这只是为了公开功能。你能做些什么(因为你提到装载机):

  1. 每个应用程序保留一个db / daoSession实例。理想情况下,将代码移动到应用程序类中或创建单例来处理它
  2. 创建一个加载器并覆盖loadInBackground()。在该方法中运行db查询并返回游标。将加载结果与光标适配器一起使用并显示数据。