数据存储是移动应用程序的关键任务之一,影响性能、安全性和用户体验。本文将介绍 SQLite、Room、Core Data、Realm、Firebase Firestore、SharedPreferences、DataStore、Keystore 和 Keychain,以及序列化格式(JSON、Protobuf)和库(Gson、Moshi、kotlinx.serialization)。本指南将帮助初学者开发人员选择正确的数据存储解决方案。更多信息请参阅 Android 官方数据存储指南。
要点
为了存储具有实体间关系的结构化数据,使用关系型数据库。
SQLite 是一个嵌入式关系型数据库,可在任何移动平台上运行。不需要单独的服务器,数据存储在一个文件中。SQLite 是 Room(Android)的基础,也可选用于 Core Data(iOS)。库:android.database.sqlite(Android)、FMDB/Core Data(iOS)、sqflite(Flutter)。
Room 是官方 Android Architecture Components 库,用于处理 SQLite。它提供 ORM 层:Entity(表)、DAO(查询)、Database(入口点)。Room 在编译时检查 SQL 查询,支持协程和 Flow,并自动迁移模式。
@Entity data class User( @PrimaryKey val id: Int, val name: String, val email: String ) @Dao interface UserDao { @Query("SELECT * FROM user WHERE id = :id") suspend fun getUser(id: Int): User? }
Core Data 是 Apple 用于管理对象图的框架。它不是纯数据库 — 它是 SQLite、XML 或二进制存储之上的持久化层。Core Data 管理对象(NSManagedObject)、关系、模式版本控制、撤消/重做以及通过 NSManagedObjectContext 进行的多线程处理。
Realm 是 SQLite 的替代品,被设计为高性能移动数据库。Realm 在读取和写入方面比 SQLite 更快,支持反应式通知(Live Objects)、即时加密和跨平台(Android、iOS、Flutter、React Native)。缺点:APK/IPA 大小增加和更高的内存使用。
为了存储少量数据(设置、令牌、缓存),使用简单的键值存储。
SharedPreferences 是 Android 中的旧版键值存储。缺点:同步访问(读取时阻塞 UI)、缺乏类型化、加载大文件时有 ANR 风险。不推荐用于新项目。
DataStore 是 Google 提供的 SharedPreferences 的现代替代品。通过 Kotlin Coroutines 和 Flow 异步工作,支持 Preferences DataStore(键值)和 Proto DataStore(通过 Protobuf 的类型化数据)。DataStore 对 UI 线程安全并支持事务。
UserDefaults 是 iOS 中用于小型设置的标准存储。支持原始类型、字符串、日期、Data。UserDefaults 是同步的,因此不适用于大数据量。通过 register(defaults:) 注册值设置默认值。
对于需要设备间同步的应用程序的数据存储,使用 Firebase 云数据库。
Firebase Firestore 是一个 NoSQL 文档数据库,具有实时订阅、自动扩展、强大的查询和内置离线模式。数据组织为集合和文档(类似 JSON 的结构)。Firestore 支持事务和批处理操作。非常适合聊天、动态和社交应用。
Firebase Realtime Database 是一个较旧的 Firebase NoSQL 数据库,将数据存储为单个 JSON 树。比 Firestore 简单,但在查询和扩展方面不太灵活。推荐用于简单的实时应用程序(在线状态、简单聊天)。
| 特性 | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| 数据模型 | 集合 → 文档 | JSON 树 |
| 查询 | 复杂(过滤、排序、限制) | 简单(按键) |
| 扩展 | 自动 | 手动分片 |
| 离线模式 | 是(持久缓存) | 是 |
| 价格 | 按读/写操作 | 按流量 + 存储 |
存储令牌、密码和加密密钥需要特殊的保护存储。
Android Keystore 是用于加密密钥的系统存储。密钥存储在硬件环境(TEE — Trusted Execution Environment)中,应用程序和操作系统无法访问。支持密钥生成、加密和签名。Android 9+ 包含 StrongBox Keymaster(专用芯片)。
Keychain Services 是用于密码、密钥和证书的安全 iOS 存储。数据使用硬件 Secure Enclave 进行加密。Keychain 支持可访问性级别:Always、WhenUnlocked、WhenUnlockedThisDeviceOnly、AfterFirstUnlock。
EncryptedSharedPreferences 是 SharedPreferences 的包装器,通过 AES256-GCM 和 HKDF 进行键值加密。在 AndroidX Security 库中实现。推荐用于存储令牌和敏感设置。
在 IT Sectr,我们使用 Android Keystore + EncryptedSharedPreferences 来存储刷新令牌和基于生物识别的密钥。在 iOS 上,我们使用 kSecAttrAccessibleWhenUnlockedThisDeviceOnly 级别的 Keychain 以获得最大安全性。
对于文件存储(图像、视频、文档),移动平台提供多种类型的存储。
Android 区分 Internal Storage(/data/data/包名/ — 私有存储)和 External Storage(SD 卡或模拟分区)。Cache Directory 是系统可以清理的临时存储。Scoped Storage(Android 10+)限制对 External Storage 的访问 — 应用程序只能看到自己的文件或通过 MediaStore/SAF 访问的文件。
iOS 提供 Documents Directory(iCloud 备份、持久数据)、Library/Caches(临时文件,不备份)和 Tmp Directory(临时,可清除)。使用 NSFileManager 处理文件系统。iOS 11+ 支持用于云文件的 File Provider。
序列化将对象转换为传输或存储的格式。反序列化是相反的过程。
JSON(JavaScript Object Notation) 是最流行的格式:可读、灵活、受所有平台支持。XML 更严格,用于旧系统。Protobuf(Protocol Buffers) 是 Google 的二进制格式:比 JSON 紧凑 3-10 倍,解析更快,具有严格的模式。用于高负载系统和微服务。
JSONSerialization 是用于处理 JSON 的内置 API。Codable(Encodable/Decodable)是一种现代 Swift 协议,用于自动序列化为 JSON、Property List 和其他格式。
struct User: Codable { let id: Int let name: String let email: String } let user = User(id: 1, name: "Alice", email: "alice@example.com") let encoder = JSONEncoder() let jsonData = try encoder.encode(user)
Flutter 和 React Native 有其自己的高效存储库。
Hive 是 Flutter 的轻量级、快速键值存储。不需要原生代码(纯 Dart),通过 TypeAdapter 支持类型化,并在隔离区中工作。非常适合缓存、设置和小数据量。
ObjectBox 是用于 Flutter、Android 和 iOS 的高性能嵌入式数据库。比 SQLite 快 10 倍以上,使用平面文件结构实现最小开销。支持关系、查询和反应式订阅(ObjectBox Dart)。
Drift 是 Flutter 和 Dart 的反应式 SQLite 库。提供类型安全查询、迁移、DAO 函数和 Stream 支持(反应式更新)。Drift 是需要 SQLite 的 Flutter 项目的主要选择。
常见问题
选择取决于平台:Room(Android)是基于 SQLite 的官方库,具有编译时查询检查。Core Data(iOS)是 Apple 的框架,带有对象图。对于跨平台项目,Realm 或通过 ORM 的 SQLite 很合适。
SharedPreferences 是具有同步访问和 ANR 风险的旧实现。DataStore(Jetpack)是基于 Kotlin Coroutines 和 Flow 的现代替代品,支持异步、类型化和错误保护。
Android:EncryptedSharedPreferences 或 Android Keystore。iOS:具有 WhenUnlockedThisDeviceOnly 可访问性的 Keychain Services。对于关键数据,使用带有生物识别的 Secure Enclave(iOS)和硬件 Keystore(Android)。
Cloud Firestore 是 Firebase 的 NoSQL 数据库,具有实时同步、离线模式和自动扩展功能。适用于聊天、新闻源和需要设备间同步的项目。
Flutter:Hive(快速键值)、Floor(SQLite ORM)、Drift(Moor、反应式 SQLite)、ObjectBox(高性能嵌入式数据库)。React Native:Realm、WatermelonDB(延迟加载)和 AsyncStorage(类似于 SharedPreferences)。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。