数据持久化确保移动应用在会话之间保存用户信息。没有这项技术,每次启动程序都将从空白开始——设置、历史和下载的文件在关闭时会丢失。根据Google Developers, 2024的数据,超过90%的移动应用使用至少一种持久化机制来保存用户数据和界面状态。
要点
Data Persistence是应用将数据保存到设备非易失性存储器中的能力。在移动开发中,持久化包括数据库、文件系统、设置和缓存。每种机制都有其独特的性能、安全性和存储容量特性。
临时数据仅存在于内存中,进程结束时丢失。包括屏幕状态、临时计算和图片缓存。持久数据写入文件系统或数据库,在应用重启后仍然可访问。包括用户设置、授权令牌、操作历史和已下载的内容。
在选择存储方式时,开发者评估多个因素。数据类型决定存储结构:简单设置——SharedPreferences或DataStore,结构化记录——SQLite或Room,文件——File Storage。数据量影响性能:数据库优化用于数千条记录,而文件适用于大型二进制对象。安全性要求通过EncryptedSharedPreferences或SQLCipher对敏感信息进行加密。
data class StorageOption(
name: String,
dataType: StorageType,
capacity: Long,
secure: Boolean
)
enum class StorageType {
KEY_VALUE,
RELATIONAL,
FILE
}
SharedPreferences是在Android上存储键值对的经典方式。此API从平台最初版本就已存在,支持原始类型:字符串、数字、布尔值。数据存储在应用私有目录的XML文件中,仅由其进程访问。
Jetpack DataStore是SharedPreferences的现代替代品,基于Kotlin Coroutines和Flow构建。DataStore提供两种变体:Preferences DataStore用于简单值,Proto DataStore用于类型化对象。与SharedPreferences不同,DataStore保证并发访问时的数据一致性,并支持异步操作而不阻塞主线程。
// 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是一种嵌入式关系型数据库,在应用进程内运行,无需独立服务器。这是移动开发中最常见的DBMS:在两个平台上都默认使用。Android将SQLite包含在SDK中,iOS包含在libsqlite3库中。SQLite支持标准SQL、事务、索引和触发器。
使用SQLite从创建数据库模式开始。开发者定义表、字段和类型,然后执行插入、读取、更新和删除操作。Android上的SQLiteOpenHelper管理数据库的创建和迁移,iOS上使用C接口或FMDB封装层。
// 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)
}
}
| 数据类型 | SharedPreferences | SQLite | 文件系统 |
|---|---|---|---|
| 类型 | 键值 | 关系型数据库 | 二进制文件 |
| 容量 | 数百条记录 | 数千条记录 | 可用空间 |
| 性能 | 高 | 中等 | 取决于大小 |
| 典型用途 | 设置 | 结构化数据 | 图片、视频 |
Room是Jetpack系列中的库,提供SQLite之上的ORM层。Room消除了编写SQL查询和ContentValues的繁琐工作,用注解和Kotlin函数替代。Room编译器在构建阶段生成DAO(数据访问对象)的实现,消除了SQL语法错误。
要连接Room,需要添加kapt依赖并注解实体类、DAO接口和数据库类。RoomDatabase作为入口点:通过它获取DAO并执行数据库操作。Room支持Flow进行响应式查询、模式迁移和编译时查询验证。
@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是Apple用于管理对象图并将其保存到磁盘的框架。与Room不同,Core Data不操作表,而是操作托管对象(NSManagedObject),这些对象形成关系层次结构。Core Data支持懒加载、撤消更改和通过NSFetchRequest进行复杂查询。
Core Data的基础是由三个组件组成的堆栈:托管上下文(NSManagedObjectContext)、持久化存储协调器(NSPersistentStoreCoordinator)和数据模型(NSManagedObjectModel)。NSPersistentContainer将所有组件统一为单一入口点,简化了现代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是将数据保存到设备非易失性存储器的机制,确保应用重启后数据的可访问性。包括数据库、文件存储和设置系统。
Room是SQLite之上的ORM封装层,消除了手动编写SQL查询和ContentValues。Room在编译时检查SQL查询,支持Kotlin Coroutines和Flow,并自动生成数据访问代码。
SharedPreferences适用于存储少量简单数据:应用设置、标志、标识符和用户偏好。对于复杂或结构化数据,最好使用Room或DataStore。
Core Data是Apple用于管理对象图的框架。它提供托管对象操作、变更跟踪、懒加载和自动保存到持久化存储(SQLite、XML或二进制格式)。
选择取决于数据复杂性:设置——DataStore或UserDefaults,结构化记录——Room(Android)或Core Data(iOS),文件——File Storage。标准包括数据量、性能要求和加密需求。在一个应用中组合多种机制是标准实践,可以充分利用每种方法的优势。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。