为了避免阻塞主线程/UI线程,Android API提供了Loader
访问数据库。为了节省内存(RAM), API不会将整行(结果)加载到内存中,因此我们可以拥有包含如此多项的ListView
而不会内存不足。
Do OrmLite &greenDAO提供了这两种功能。如果没有,是否有任何方法做异步查询和部分加载和交换填充巨大的数据到ListView
?
我不认为orm框架提供了只加载行部分的能力。
使用greendao,您可以在Query
上使用listLazy()
从DB惰性加载实体。与"预取"所有实体相比,这带来了巨大的性能优势。
我知道greendao还提供了一些使用AsyncSession
异步加载实体的方法。但我目前不知道如何使用它。
通常情况下,greendao中的所有crud操作都发生在调用update等操作的同一个线程上。
我还没有使用过OrmLite,所以我没有关于这个的信息
我不能在OrmLite上发音,但是使用greenDAO我知道你可以在数据库上执行原始查询。毕竟,在所有生成的代码下面是一个SQLITE数据库。
看一下greenDAO示例项目中的NoteActivity:https://github.com/greenrobot/greenDAO/blob/master/DaoExample/src/main/java/de/greenrobot/daoexample/NoteActivity.java
在onCreate()中,你可以清楚地看到光标是这样获取的:
DevOpenHelper = new DaoMaster。DevOpenHelper(this, "db_name", null);
sqliteddatabasedb = helper.getWritableDatabase();DaoMaster = new DaoMaster(db);
DaoSession = daoMaster.newSession();ObjectDao ObjectDao = daossession . getobjectdao ();
[. .]
Cursor = db.query(objectDao.getTablename(), objectDao.getAllColumns(), null, null, null, null, null);
可以看到,这个游标可以用作任何其他游标来显示数据。现在,在主线程上这样做是错误的,这样做只是为了暴露一个功能。您可以从这里做什么(因为您提到了加载器):
- 为每个应用程序保留一个db/daoSession实例。理想情况下,将代码移动到应用程序类中或创建一个单例来处理它
- 创建加载器并覆盖loadInBackground()。在该方法中,运行db查询并返回游标。将加载结果与光标适配器一起使用并显示数据。