在 Android 开发中,持久化(Persistence)是指将数据保存到存储设备中,以确保应用退出或设备重启后数据依然存在。

根据数据的规模结构化程度以及访问频率,主要有以下几种主流方案:


1. 键值对存储 (Key-Value Storage)

适用于保存应用设置、用户偏好或少量的简单状态。

  • Jetpack DataStore (推荐): Google 官方推荐用来替代 SharedPreferences 的现代方案。它基于 Kotlin 协程Flow,解决了 SP 在主线程 I/O、异常处理和事务安全性上的弊端。

    • Preferences DataStore: 存储简单的键值对,不保证类型安全。

    • Proto DataStore: 结合 Protocol Buffers 存储自定义对象,提供强类型支持。

  • SharedPreferences (旧版/维护): 传统的键值对存储方式。虽然简单,但因为会在主线程读取、不支持局部更新等缺陷,在 2026 年的开发中已逐渐被 DataStore 取代。

  • MMKV(腾讯-微信存储方案)


2. 数据库存储 (Structured Data)

适用于存储大量结构化、且需要复杂查询的数据。

  • Room Persistence Library (推荐): Jetpack 组件之一,是 SQLite 之上的抽象层。

    • 优点: 编译时 SQL 语法检查、减少样板代码、完美支持对象映射(ORM)、支持返回 FlowLiveData 实现响应式 UI。

    • 地位: 目前 Android 官方唯一指定的数据库标准方案。

  • SQLite: Android 自带的关系型数据库。虽然可以利用 SQLiteOpenHelper 直接操作,但由于代码繁琐且易错,现在开发者通常直接使用 Room。

  • SQLite

  • GreenSQL


3. 文件存储 (File Storage)

适用于存储图片、视频、日志或大型二进制文件。

  • 内部存储 (App-specific Storage): 存储在 /data/data/<package_name>/ 下。数据是私有的,应用卸载时会被自动删除。

  • 外部存储 (Shared Storage): 用于存储可与其他应用共享的文件(如相册中的照片)。

    • Scoped Storage (分区存储): Android 10 以后强制执行。应用只能直接访问自己的目录,访问公共媒体库(图片、音频等)需使用 MediaStore API

    • Storage Access Framework (SAF): 通过系统文件选择器让用户选择特定文件或目录。


4. 方案对比与选型指南

存储方案

适合数据类型

读写速度

类型安全

推荐使用场景

DataStore

简单配置、用户偏好

是 (Proto)

替代 SharedPreferences,保存开关、Token 等

Room

复杂列表、关系型数据

聊天记录、缓存文章列表、本地搜索

MediaStore

媒体文件 (图/音/影)

慢 (I/O)

保存照片到相册、扫描本地音乐

文件存储

日志、临时缓存、文档

取决于大小

下载 PDF、保存临时拍照缩略图


5. 进阶/第三方方案

在某些特定场景下,你可能还会遇到:

  • EncryptedSharedPreferences / EncryptedFile: 用于存储密钥等敏感信息(属于 Security 库)。

  • SQLDelight: 一个可以将 SQL 语句生成类型安全 Kotlin 代码的库,在 KMP(Kotlin Multiplatform)跨平台开发中非常流行。

  • MMKV: 腾讯开发的基于 mmap 的高性能键值对存储库,读写效率极高。