移动开发中的数据持久化——定义、方式与工作原理

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

数据持久化确保移动应用在会话之间保存用户信息。没有这项技术,每次启动程序都将从空白开始——设置、历史和下载的文件在关闭时会丢失。根据Google Developers, 2024的数据,超过90%的移动应用使用至少一种持久化机制来保存用户数据和界面状态。

要点

  • Data Persistence——在应用会话之间保存数据的机制
  • SharedPreferences——在Android上存储简单的键值对
  • SQLite——适用于移动设备的内置关系型数据库
  • Room——Google提供的Android SQLite ORM封装层
  • Core Data——iOS和macOS上的对象管理框架

什么是数据持久化

Data Persistence是应用将数据保存到设备非易失性存储器中的能力。在移动开发中,持久化包括数据库、文件系统、设置和缓存。每种机制都有其独特的性能、安全性和存储容量特性。

临时数据和持久数据

临时数据仅存在于内存中,进程结束时丢失。包括屏幕状态、临时计算和图片缓存。持久数据写入文件系统或数据库,在应用重启后仍然可访问。包括用户设置、授权令牌、操作历史和已下载的内容。

选择存储机制的准则

在选择存储方式时,开发者评估多个因素。数据类型决定存储结构:简单设置——SharedPreferences或DataStore,结构化记录——SQLite或Room,文件——File Storage。数据量影响性能:数据库优化用于数千条记录,而文件适用于大型二进制对象。安全性要求通过EncryptedSharedPreferences或SQLCipher对敏感信息进行加密。

kotlin
data class StorageOption(
    name: String,
    dataType: StorageType,
    capacity: Long,
    secure: Boolean
)

enum class StorageType {
    KEY_VALUE,
    RELATIONAL,
    FILE
}

SharedPreferences和DataStore

SharedPreferences是在Android上存储键值对的经典方式。此API从平台最初版本就已存在,支持原始类型:字符串、数字、布尔值。数据存储在应用私有目录的XML文件中,仅由其进程访问。

DataStore作为替代方案

Jetpack DataStore是SharedPreferences的现代替代品,基于Kotlin Coroutines和Flow构建。DataStore提供两种变体:Preferences DataStore用于简单值,Proto DataStore用于类型化对象。与SharedPreferences不同,DataStore保证并发访问时的数据一致性,并支持异步操作而不阻塞主线程。

kotlin
// SharedPreferences——传统方式
val prefs = context
    .getSharedPreferences("settings", Context.MODE_PRIVATE)
with (prefs.edit()) {
    putString("username", "john_doe")
    putInt("score", 1500)
    apply()
}

// DataStore——异步方法
val settingsDataStore = context
    .createDataStore("settings.pb")

val usernameFlow: Flow<String> = settingsDataStore
    .data
    .map { it[USERNAME_KEY] ?: "" }

在iOS上,SharedPreferences的对应物是UserDefaults——以Property List格式存储简单值的系统。UserDefaults使用同步访问,适用于小量配置数据,但不推荐用于存储敏感信息。

移动应用中的SQLite

SQLite是一种嵌入式关系型数据库,在应用进程内运行,无需独立服务器。这是移动开发中最常见的DBMS:在两个平台上都默认使用。Android将SQLite包含在SDK中,iOS包含在libsqlite3库中。SQLite支持标准SQL、事务、索引和触发器。

创建表和CRUD操作

使用SQLite从创建数据库模式开始。开发者定义表、字段和类型,然后执行插入、读取、更新和删除操作。Android上的SQLiteOpenHelper管理数据库的创建和迁移,iOS上使用C接口或FMDB封装层。

kotlin
// Android上的SQLiteOpenHelper
class DBHelper(context: Context) :
    SQLiteOpenHelper(context, "app.db", null, 1) {

    override fun onCreate(db: SQLiteDatabase) {
        db.execSQL("""
            CREATE TABLE users (
                id INTEGER PRIMARY KEY,
                name TEXT NOT NULL,
                email TEXT UNIQUE
            )
        """)
    }

    fun insertUser(name: String, email: String) {
        val db = writableDatabase
        val values = ContentValues().apply {
            put("name", name)
            put("email", email)
        }
        db.insert("users", null, values)
    }
}
数据类型SharedPreferencesSQLite文件系统
类型键值关系型数据库二进制文件
容量数百条记录数千条记录可用空间
性能中等取决于大小
典型用途设置结构化数据图片、视频

Room——Android的ORM

Room是Jetpack系列中的库,提供SQLite之上的ORM层。Room消除了编写SQL查询和ContentValues的繁琐工作,用注解和Kotlin函数替代。Room编译器在构建阶段生成DAO(数据访问对象)的实现,消除了SQL语法错误。

在项目中配置Room

要连接Room,需要添加kapt依赖并注解实体类、DAO接口和数据库类。RoomDatabase作为入口点:通过它获取DAO并执行数据库操作。Room支持Flow进行响应式查询、模式迁移和编译时查询验证。

kotlin
@Entity(tableName = "users")
data class User(
    @PrimaryKey val id: Int,
    @ColumnInfo(name = "full_name") val name: String,
    @ColumnInfo val email: String
)

@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    fun getAll(): Flow<List<User>>

    @Insert
    suspend fun insert(user: User)

    @Delete
    suspend fun delete(user: User)
}

@Database(
    entities = [User::class],
    version = 1
)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

Core Data——iOS框架

Core Data是Apple用于管理对象图并将其保存到磁盘的框架。与Room不同,Core Data不操作表,而是操作托管对象(NSManagedObject),这些对象形成关系层次结构。Core Data支持懒加载、撤消更改和通过NSFetchRequest进行复杂查询。

Core Data堆栈

Core Data的基础是由三个组件组成的堆栈:托管上下文(NSManagedObjectContext)、持久化存储协调器(NSPersistentStoreCoordinator)和数据模型(NSManagedObjectModel)。NSPersistentContainer将所有组件统一为单一入口点,简化了现代Swift应用的配置。

swift
import CoreData

class PersistenceController {
    static let shared = PersistenceController()
    let container: NSPersistentContainer

    init() {
        container = NSPersistentContainer(name: "AppModel")
        container.loadPersistentStores { _, error in
            if let error = error {
                fatalError("Failed: \(error)")
            }
        }
    }

    func saveUser(name: String, email: String) {
        let context = container.viewContext
        let user = User(context: context)
        user.name = name
        user.email = email

        do {
            try context.save()
        } catch let error {
            print("保存错误:\(error)")
        }
    }
}

文件存储(File Storage)用于保存图片、视频和文档。Android提供内部存储(context.filesDir)——应用私有,和外部存储(Environment.getExternalStorageDirectory)——其他应用可访问。在iOS上,文件保存在Documents和Library目录中,Library/Caches用于不备份到iCloud的缓存。两个平台都提供File API和流式读写操作。现代库如Coil和SDWebImage添加了缓存层,将文件存储与内存结合以实现最佳性能。

在Android上,Core Data在复杂性和功能方面的替代方案是Realm——一种面向对象的数据库,直接与模型一起工作,无需SQL层。Realm在读取操作上比SQLite更快,并支持在数据更改时自动更新UI的活动对象。

常见问题

移动开发中的Data Persistence是什么?

Data Persistence是将数据保存到设备非易失性存储器的机制,确保应用重启后数据的可访问性。包括数据库、文件存储和设置系统。

Room与直接使用SQLite有何不同?

Room是SQLite之上的ORM封装层,消除了手动编写SQL查询和ContentValues。Room在编译时检查SQL查询,支持Kotlin Coroutines和Flow,并自动生成数据访问代码。

何时应该使用SharedPreferences?

SharedPreferences适用于存储少量简单数据:应用设置、标志、标识符和用户偏好。对于复杂或结构化数据,最好使用Room或DataStore。

iOS上的Core Data是什么?

Core Data是Apple用于管理对象图的框架。它提供托管对象操作、变更跟踪、懒加载和自动保存到持久化存储(SQLite、XML或二进制格式)。

新项目应该选择哪种数据存储方式?

选择取决于数据复杂性:设置——DataStore或UserDefaults,结构化记录——Room(Android)或Core Data(iOS),文件——File Storage。标准包括数据量、性能要求和加密需求。在一个应用中组合多种机制是标准实践,可以充分利用每种方法的优势。

总结

  • Data Persistence——每个移动应用的基础,确保会话间用户数据的保存
  • SharedPreferences和UserDefaults——用于存储键值对的简单系统,具有同步访问
  • SQLite——嵌入式关系型数据库,无需额外依赖即可在两个平台上使用
  • Room——Google的ORM解决方案,提供类型安全和通过Flow的响应式查询
  • Core Data——强大的Apple框架,用于管理复杂对象图并自动跟踪更改
  • DataStore——SharedPreferences的现代替代品,具有基于Coroutines和Flow的异步API

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

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

讨论项目

另请阅读