Room DAO 游标替换
Room DAO Cursor replacement
目前我正在重构一个有点旧的项目,并决定使用 Room DAO。该项目使用 Cursor 来显示一长串实体。 Ok Room DAO 有能力 return Cursor。
@Query("SELECT * FROM user")
public Cursor loadUsers();
但是官方文档不鼓励我们使用它
Caution: It's highly discouraged to work with the Cursor API because
it doesn't guarantee whether the rows exist or what values the rows
contain. Use this functionality only if you already have code that
expects a cursor and that you can't refactor easily.
文档建议这样做
@Query("SELECT * FROM user")
public List<User> loadUsers();
我担心的是,这实际上会从 table 获取所有数据并将它们保存在内存中(我错过了什么吗?)。相比之下,游标只保存一堆数据 (window) 并根据需要获取新的部分。
所以问题是如何使用 Room DAO 进行大型数据库查询并保持低内存使用率?
恕我直言,如果您有一个依赖游标 windows 的大型数据库查询,您应该重新考虑您的 UI。例如,用户不想滑动列表中的数千行。
但是,架构组件针对您的问题的解决方案是 the Paging library。您可以让您的 DAO return 成为 DataSource.Factory
而不是 Cursor
或 List
,并且您可以使用 DataSource.Factory
将页面传送到您的 UI(例如 RecyclerView
)根据需要。
目前我正在重构一个有点旧的项目,并决定使用 Room DAO。该项目使用 Cursor 来显示一长串实体。 Ok Room DAO 有能力 return Cursor。
@Query("SELECT * FROM user")
public Cursor loadUsers();
但是官方文档不鼓励我们使用它
Caution: It's highly discouraged to work with the Cursor API because it doesn't guarantee whether the rows exist or what values the rows contain. Use this functionality only if you already have code that expects a cursor and that you can't refactor easily.
文档建议这样做
@Query("SELECT * FROM user")
public List<User> loadUsers();
我担心的是,这实际上会从 table 获取所有数据并将它们保存在内存中(我错过了什么吗?)。相比之下,游标只保存一堆数据 (window) 并根据需要获取新的部分。
所以问题是如何使用 Room DAO 进行大型数据库查询并保持低内存使用率?
恕我直言,如果您有一个依赖游标 windows 的大型数据库查询,您应该重新考虑您的 UI。例如,用户不想滑动列表中的数千行。
但是,架构组件针对您的问题的解决方案是 the Paging library。您可以让您的 DAO return 成为 DataSource.Factory
而不是 Cursor
或 List
,并且您可以使用 DataSource.Factory
将页面传送到您的 UI(例如 RecyclerView
)根据需要。