移动开发中的数据存储:概念、方法及工作原理

作者: IT Sectr 发布日期: 2026-03-08 阅读时间: 9 分钟

数据存储是移动应用程序的关键任务之一,影响性能、安全性和用户体验。本文将介绍 SQLite、Room、Core Data、Realm、Firebase Firestore、SharedPreferences、DataStore、Keystore 和 Keychain,以及序列化格式(JSON、Protobuf)和库(Gson、Moshi、kotlinx.serialization)。本指南将帮助初学者开发人员选择正确的数据存储解决方案。更多信息请参阅 Android 官方数据存储指南

要点

  • Room(Android)和 Core Data(iOS)是每个平台上处理关系型数据库的官方 ORM
  • SharedPreferences(Android)正被 DataStore 取代 — 一种异步且类型安全的键值存储
  • 为了安全地存储令牌,使用带有硬件保护的 Keystore(Android)和 Keychain(iOS)
  • Firebase Firestore 是一个具有实时同步和离线模式的 NoSQL 数据库
  • 序列化 — 通过 Gson、Moshi、kotlinx.serialization 将对象转换为 JSON/Protobuf

本地数据库:SQLite、Room、Core Data、Realm

为了存储具有实体间关系的结构化数据,使用关系型数据库。

SQLite

SQLite 是一个嵌入式关系型数据库,可在任何移动平台上运行。不需要单独的服务器,数据存储在一个文件中。SQLite 是 Room(Android)的基础,也可选用于 Core Data(iOS)。库:android.database.sqlite(Android)、FMDB/Core Data(iOS)、sqflite(Flutter)。

Room(Android)

Room 是官方 Android Architecture Components 库,用于处理 SQLite。它提供 ORM 层:Entity(表)、DAO(查询)、Database(入口点)。Room 在编译时检查 SQL 查询,支持协程和 Flow,并自动迁移模式。

kotlin
@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(iOS)

Core Data 是 Apple 用于管理对象图的框架。它不是纯数据库 — 它是 SQLite、XML 或二进制存储之上的持久化层。Core Data 管理对象(NSManagedObject)、关系、模式版本控制、撤消/重做以及通过 NSManagedObjectContext 进行的多线程处理。

Realm

Realm 是 SQLite 的替代品,被设计为高性能移动数据库。Realm 在读取和写入方面比 SQLite 更快,支持反应式通知(Live Objects)、即时加密和跨平台(Android、iOS、Flutter、React Native)。缺点:APK/IPA 大小增加和更高的内存使用。

键值存储和设置

为了存储少量数据(设置、令牌、缓存),使用简单的键值存储。

SharedPreferences(Android)

SharedPreferences 是 Android 中的旧版键值存储。缺点:同步访问(读取时阻塞 UI)、缺乏类型化、加载大文件时有 ANR 风险。不推荐用于新项目。

DataStore(Jetpack Android)

DataStore 是 Google 提供的 SharedPreferences 的现代替代品。通过 Kotlin Coroutines 和 Flow 异步工作,支持 Preferences DataStore(键值)和 Proto DataStore(通过 Protobuf 的类型化数据)。DataStore 对 UI 线程安全并支持事务。

NSUserDefaults(iOS)

UserDefaults 是 iOS 中用于小型设置的标准存储。支持原始类型、字符串、日期、Data。UserDefaults 是同步的,因此不适用于大数据量。通过 register(defaults:) 注册值设置默认值。

云数据库:Firebase Firestore 和 Realtime DB

对于需要设备间同步的应用程序的数据存储,使用 Firebase 云数据库。

Cloud Firestore

Firebase Firestore 是一个 NoSQL 文档数据库,具有实时订阅、自动扩展、强大的查询和内置离线模式。数据组织为集合和文档(类似 JSON 的结构)。Firestore 支持事务和批处理操作。非常适合聊天、动态和社交应用。

Firebase Realtime Database

Firebase Realtime Database 是一个较旧的 Firebase NoSQL 数据库,将数据存储为单个 JSON 树。比 Firestore 简单,但在查询和扩展方面不太灵活。推荐用于简单的实时应用程序(在线状态、简单聊天)。

特性Cloud FirestoreFirebase Realtime DB
数据模型集合 → 文档JSON 树
查询复杂(过滤、排序、限制)简单(按键)
扩展自动手动分片
离线模式是(持久缓存)
价格按读/写操作按流量 + 存储

安全存储:Keystore、Keychain 和 EncryptedSharedPreferences

存储令牌、密码和加密密钥需要特殊的保护存储。

Android Keystore

Android Keystore 是用于加密密钥的系统存储。密钥存储在硬件环境(TEE — Trusted Execution Environment)中,应用程序和操作系统无法访问。支持密钥生成、加密和签名。Android 9+ 包含 StrongBox Keymaster(专用芯片)。

iOS Keychain

Keychain Services 是用于密码、密钥和证书的安全 iOS 存储。数据使用硬件 Secure Enclave 进行加密。Keychain 支持可访问性级别:Always、WhenUnlocked、WhenUnlockedThisDeviceOnly、AfterFirstUnlock。

EncryptedSharedPreferences(Android)

EncryptedSharedPreferences 是 SharedPreferences 的包装器,通过 AES256-GCM 和 HKDF 进行键值加密。在 AndroidX Security 库中实现。推荐用于存储令牌和敏感设置。

在 IT Sectr,我们使用 Android Keystore + EncryptedSharedPreferences 来存储刷新令牌和基于生物识别的密钥。在 iOS 上,我们使用 kSecAttrAccessibleWhenUnlockedThisDeviceOnly 级别的 Keychain 以获得最大安全性。

文件存储:Internal、External、Cache Directory

对于文件存储(图像、视频、文档),移动平台提供多种类型的存储。

Android Storage

Android 区分 Internal Storage(/data/data/包名/ — 私有存储)和 External Storage(SD 卡或模拟分区)。Cache Directory 是系统可以清理的临时存储。Scoped Storage(Android 10+)限制对 External Storage 的访问 — 应用程序只能看到自己的文件或通过 MediaStore/SAF 访问的文件。

iOS Storage

iOS 提供 Documents Directory(iCloud 备份、持久数据)、Library/Caches(临时文件,不备份)和 Tmp Directory(临时,可清除)。使用 NSFileManager 处理文件系统。iOS 11+ 支持用于云文件的 File Provider。

数据序列化:JSON、Protobuf 和库

序列化将对象转换为传输或存储的格式。反序列化是相反的过程。

格式

JSON(JavaScript Object Notation) 是最流行的格式:可读、灵活、受所有平台支持。XML 更严格,用于旧系统。Protobuf(Protocol Buffers) 是 Google 的二进制格式:比 JSON 紧凑 3-10 倍,解析更快,具有严格的模式。用于高负载系统和微服务。

Android 库

  • Gson(Google)— 简单、灵活,但速度慢。自动与 Java/Kotlin 对象一起工作
  • Moshi(Square)— 比 Gson 更快,更好的 Kotlin 支持(非空属性、默认值、密封类)
  • kotlinx.serialization — JetBrains 的原生 Kotlin 序列化,在编译时工作,支持 JSON、Protobuf、CBOR

iOS 库

JSONSerialization 是用于处理 JSON 的内置 API。Codable(Encodable/Decodable)是一种现代 Swift 协议,用于自动序列化为 JSON、Property List 和其他格式。

swift
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)

跨平台解决方案:Hive、ObjectBox、Drift

Flutter 和 React Native 有其自己的高效存储库。

Hive(Flutter)

Hive 是 Flutter 的轻量级、快速键值存储。不需要原生代码(纯 Dart),通过 TypeAdapter 支持类型化,并在隔离区中工作。非常适合缓存、设置和小数据量。

ObjectBox

ObjectBox 是用于 Flutter、Android 和 iOS 的高性能嵌入式数据库。比 SQLite 快 10 倍以上,使用平面文件结构实现最小开销。支持关系、查询和反应式订阅(ObjectBox Dart)。

Drift(原 Moor)

Drift 是 Flutter 和 Dart 的反应式 SQLite 库。提供类型安全查询、迁移、DAO 函数和 Stream 支持(反应式更新)。Drift 是需要 SQLite 的 Flutter 项目的主要选择。

常见问题

本地数据存储哪个更好:Room 还是 Core Data?

选择取决于平台:Room(Android)是基于 SQLite 的官方库,具有编译时查询检查。Core Data(iOS)是 Apple 的框架,带有对象图。对于跨平台项目,Realm 或通过 ORM 的 SQLite 很合适。

SharedPreferences 和 DataStore 有什么区别?

SharedPreferences 是具有同步访问和 ANR 风险的旧实现。DataStore(Jetpack)是基于 Kotlin Coroutines 和 Flow 的现代替代品,支持异步、类型化和错误保护。

如何在移动应用中安全地存储令牌和密码?

Android:EncryptedSharedPreferences 或 Android Keystore。iOS:具有 WhenUnlockedThisDeviceOnly 可访问性的 Keychain Services。对于关键数据,使用带有生物识别的 Secure Enclave(iOS)和硬件 Keystore(Android)。

什么是 Firebase Firestore,何时使用它?

Cloud Firestore 是 Firebase 的 NoSQL 数据库,具有实时同步、离线模式和自动扩展功能。适用于聊天、新闻源和需要设备间同步的项目。

Flutter 和 React Native 有哪些 ORM?

Flutter:Hive(快速键值)、Floor(SQLite ORM)、Drift(Moor、反应式 SQLite)、ObjectBox(高性能嵌入式数据库)。React Native:Realm、WatermelonDB(延迟加载)和 AsyncStorage(类似于 SharedPreferences)。

总结

  • Room(Android)和 Core Data(iOS)是每个平台上关系型数据库的官方解决方案
  • DataStore 取代 SharedPreferences 用于异步设置存储
  • Keystore / Keychain 对于安全存储令牌和密钥是必需的
  • Firebase Firestore 是设备间实时同步的最佳选择
  • Kotlinx.serialization(Android)和 Codable(iOS)是现代的序列化方法
  • 对于 Flutter:Drift(SQLite)、Hive(键值)、ObjectBox(高性能)
  • Realm 是 SQLite 的跨平台替代品,具有反应式通知

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目