目前我正在重构一个旧项目并决定使用Room DAO。该项目使用Cursor显示一长串实体。好的房间DAO有能力返回光标。
@Query("SELECT * FROM user")
public Cursor loadUsers();
但官方文件阻止我们使用它
警告:非常不鼓励使用Cursor API,因为 它不能保证行是否存在或行的值是什么 包含。仅当您已有代码时才使用此功能 期待一个光标,你不能轻易地重构。
文档建议以这种方式进行
@Query("SELECT * FROM user")
public List<User> loadUsers();
我担心的是,这实际上是从表中获取所有数据并将它们保存在内存中(我错过了吗?)。相比之下,游标只保存一堆数据(窗口),并根据需要获取新部分。
所以问题是如何使用Room DAO进行大型数据库查询以保持低内存使用率?
答案 0 :(得分:0)
恕我直言,如果您有一个依赖光标窗口的大型数据库查询,那么您应该重新考虑您的UI。例如,用户不想浏览列表中的数千行。
但是,针对您的问题的架构组件解决方案是the Paging library。您可以让DAO返回DataSource.Factory
而不是Cursor
或List
,然后您可以使用DataSource.Factory
将页面传送到您的用户界面(例如{{1}根据需要。