Android常见数据存储方式分类

Android 常见数据存储方式对比

在 Android 开发中,数据存储方式多种多样,不同的方案适合不同的场景。常见的有 SharedPreferences、Preferences DataStore、Proto DataStore 和 Room。本文将对它们进行分类与对比。


1. 轻量级存储

SQL 和 Room 是功能强大的工具。但是,在不需要存储关系型数据的情况下,DataStore 可以提供一种简单的解决方案。Jetpack 中的 DataStore 组件非常适合存储简单的小型数据集,且开销较低。

SharedPreferences

  • 定位:最传统的轻量级存储方式
  • 数据结构:Key-Value
  • 存储位置:XML 文件(data/data/<package>/shared_prefs/
  • 优点:简单、易用
  • 缺点
    • 同步 API,可能阻塞主线程
    • 多线程写入可能导致数据不一致
  • 适用场景:保存布尔开关、用户设置等少量数据

🔹Preferences DataStore

Preferences DataStore 存储键值对。这些值可以是 Kotlin 的基本数据类型,例如 String、Boolean 和 Integer。它不存储复杂的数据集,也不需要预定义的架构。Preferences Datastore 的主要应用场景是在用户的设备上存储其偏好设置。

  • 定位:Google 推荐的 SharedPreferences 替代方案
  • 数据结构:Key-Value
  • 基于:Kotlin 协程 + Flow
  • 存储位置preferences_pb 文件(protobuf 格式)
  • 优点
    • 异步、线程安全
    • 数据一致性强
    • 支持 Flow 实时监听数据变化
  • 适用场景:用户配置、轻量级设置参数

Proto DataStore

Proto DataStore 存储自定义数据的类型。它需要一个预定义的架构,用于将 proto 定义映射到对象结构。

  • 定位:比 Preferences DataStore 更灵活的存储方式
  • 数据结构:自定义对象(通过 .proto 定义)
  • 存储位置:二进制 Protobuf 文件
  • 优点
    • 可以存储复杂对象
    • 类型安全,避免 Key 拼写错误
    • 便于数据 schema 演进(版本升级时更容易迁移)
  • 适用场景:需要保存结构化的配置或复杂对象

2. 关系型数据库存储

Room

  • 定位:官方推荐的 SQLite ORM 封装
  • 数据结构:关系型表(SQL)
  • 存储位置:SQLite 数据库文件(.db
  • 优点
    • 支持复杂 SQL 查询
    • 支持关系映射(外键、一对多、多对多)
    • 编译时检查 SQL 语句合法性
    • 内置协程和 Flow 支持
  • 适用场景
    • 大量结构化数据
    • 离线缓存(如新闻列表、用户收藏、聊天记录)

对比总结表

特性 SharedPreferences Preferences DataStore Proto DataStore Room
存储类型 Key-Value Key-Value 自定义对象 (Proto) 关系型数据库 (SQL)
数据量 很小 小到中
数据结构 XML protobuf (内部) protobuf SQLite
线程安全 ❌ 否 ✅ 是 ✅ 是 ✅ 是
适用场景 简单配置 简单配置(推荐) 复杂对象、小型配置 大量结构化数据
API 风格 同步 异步 + Flow 异步 + Flow 异步 + Flow / RxJava
推荐程度 ❌ 已过时 ✅ 推荐 ✅ 推荐 ✅ 推荐

📌 总结

  • SharedPreferences:老旧的方式,能用但已不推荐
  • Preferences DataStore:现代化 Key-Value 存储,轻量首选
  • Proto DataStore:适合存储复杂结构化对象
  • Room:关系型数据库,适合存储大量、复杂的数据

✅ 一句话:
小数据 → DataStore(Preferences/Proto)
大数据 → Room

  • Copyrights © 2023-2025 Hexo

请我喝杯咖啡吧~

支付宝
微信