主要观点总结
本文介绍了在使用Room数据库时,如何避免OOM(OutOfMemoryError)错误,包括分页查询、使用Flow或LiveData、限制查询数据量、选择必要的字段、配置SQLite的内存管理、避免在主线程查询、使用Cursor、优化数据库设计等方法。同时,也讨论了在使用Cursor时如何确保及时释放资源,介绍了@Transaction的作用,如何优雅删除表的数据,如何调整数据库的缓存大小,以及在使用SELECT语句时需要注意的事项。此外,还解释了翻页查询中需要注意的问题,以及删除表中所有数据(clearUsersTable)与DELETE FROM users的区别。最后,文章还介绍了使用SQLCipher加密Room数据库时的注意事项,以及实体类字段名称不能以“is”开头的原因。
关键观点总结
关键观点1: 使用Room数据库避免OOM的方法
包括分页查询、使用Flow或LiveData、限制查询数据量、选择必要的字段、配置SQLite的内存管理、避免在主线程查询、使用Cursor、优化数据库设计等方法。
关键观点2: 使用Cursor时的资源管理
介绍了使用Cursor时的最佳实践,包括手动管理Cursor、使用try-with-resources、在ViewModel或Repository中管理Cursor、在AsyncTask中使用Cursor以及在ContentProvider中使用Cursor。
关键观点3: @Transaction的作用
确保多个数据库操作在一个原子操作中执行,确保操作要么全部成功,要么全部失败,从而保持数据库状态的一致性。
关键观点4: 优雅删除表的数据
讨论了如何优雅删除表的数据,包括使用@Query执行DELETE语句、使用Room的事务、使用WorkManager进行后台操作以及适当的异常处理和内存管理。
关键观点5: 调整数据库的缓存大小
解释了无法直接调整数据库的缓存大小,但可以通过分页查询、优化查询语句、使用事务、避免内存泄漏以及选择合适的数据库管理策略来优化数据访问和内存管理。
关键观点6: 使用SELECT语句的注意事项
讨论了在使用SELECT语句时需要注意的要点,包括列名的一致性、防止SQL注入、资源管理、处理空值、索引优化、查询性能以及并发控制。
关键观点7: 翻页查询的注意事项
介绍了在翻页查询中需要注意的问题,包括防止越界问题,通过获取总记录数和检查页面索引来确保查询不会尝试跳过超过数据库中实际存在的记录数。
关键观点8: 删除表中所有数据(clearUsersTable)与DELETE FROM users的区别
解释了两者在功能上的相同之处,以及在使用场景和实现细节上的不同之处。
关键观点9: 使用SQLCipher的注意事项
介绍了在使用SQLCipher加密Room数据库时的注意事项,包括初始化SQLCipher和Room、数据库操作、密码管理以及数据库升级和性能影响。
关键观点10: 实体类字段名称不能以“is”开头的原因
解释了为何在Room中,实体类的字段名称不能以“is”开头,以及如何使用@ColumnInfo注解来更改数据库中的列名。
文章预览
本文作者 作者: 未扬帆的小船 链接: https://juejin.cn/post/7386844718141374473 本文由作者授权发布。 1 问题1:Room怎么查询大量数据的表而不导致OOM? 1. 分页查询(Paging Library) 使用Android Paging Library可以有效地分批加载数据,而不是一次性加载所有数据。 java // 在Dao中使用PagingSource @Query( "SELECT * FROM your_table" ) PagingSource getAllData(); 在ViewModel中: java public LiveData > getPagedData () { return new Pager( new PagingConfig( pageSize = 20, // 每页加载的数据量 enablePlaceholders = false ) ) { @Override public PagingSource create () { return yourDao.getAllData(); } }.liveData; } 2. 使用流(Flow)或 LiveData 使用Flow或LiveData,可以逐步加载数据,减少内存占用
………………………………