Android:不使用Content Provider/Loaders,屏幕旋转时如何保留单例数据库数据?
Android屏幕旋转后保留单例数据库数据(禁用Content Provider/Loaders)
这道面试题曾经把我卡得死死的,今天分享出来帮大家避坑:在Android中,不使用Content Provider或Loaders,如何在Activity屏幕旋转后保留单例数据库的数据?
我当时的踩坑思路
- 第一反应就是用
ContentProvider搭配CursorLoader——毕竟这是官方推荐的处理数据库数据和生命周期的常规操作,但面试官直接否决了这个方案。 - 之后我想过把单例DB查询返回的
Cursor存在onSaveInstanceState的Bundle里,结果很快发现根本行不通:Cursor是无法直接序列化存入Bundle的,当时完全没了头绪。 - 我还忍不住问面试官:“单例数据库不是实际开发里不推荐使用吗?”对方笑着回应:“没错,但这只是面试场景~”
面试场景下的可行解决方案
其实核心是避开直接保存Cursor,转而保存查询的关键参数,在重建后的Activity中重新查询单例数据库:
- 在
onSaveInstanceState方法中,把查询所需的核心条件(比如目标表名、筛选条件selection、排序规则sortOrder等)存入Bundle——这些都是字符串、整数这类可序列化的基本类型,能正常被Bundle保存。 - 当Activity因屏幕旋转重建后,在
onCreate或onRestoreInstanceState中取出这些参数,调用单例数据库的查询方法重新获取数据即可。 - 另外,还有一种取巧的思路:给Activity的
android:configChanges属性添加orientation|screenSize,这样屏幕旋转时Activity不会触发重建,自然就能保留单例数据库的数据。不过这种方式在实际开发中要谨慎使用(会跳过系统的生命周期重建逻辑,可能引发其他适配问题),但面试场景下可以作为一种备选思路提及。
这样既符合面试官禁用Content Provider/Loaders的要求,又能实现屏幕旋转后的数据保留,亲测能过面试~
内容的提问来源于stack exchange,提问作者eric
相关产品推荐
相关产品推荐

