上一篇
安卓开发过程中如何保存数据
- 行业动态
- 2025-04-22
- 6
安卓数据存储方式详解
SharedPreferences(轻量级键值对)
适用场景:存储简单配置项(如用户偏好、登录状态)
特点:
- 基于XML文件,以键值对形式存储
- 支持
int/float/String/boolean/Set
等基础类型 - 异步提交(
apply()
)或同步提交(commit()
)
示例代码:
// 获取实例 SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); // 写入数据 sp.edit() .putString("username", "John") .putBoolean("isLoggedIn", true) .apply(); // 读取数据 String name = sp.getString("username", "default");
文件存储(原始文件操作)
适用场景:存储文本/二进制文件(如日志、图片缓存)
特点:
- 分为内部存储(
getFilesDir()
)和外部存储(需申请权限) - 需处理文件读写权限(Android 10+作用域存储限制)
- 适合临时数据或媒体文件
存储位置对比:
| 存储类型 | 路径示例 | 是否需要权限 | 数据存活性 |
|———-|———-|————–|————|
| 内部存储 | /data/data/包名/files/
| 否 | 应用卸载即删 |
| 外部存储 | /storage/emulated/0/
| 是(Android 6+) | 手动删除 |
SQLite数据库(结构化存储)
适用场景:复杂关系型数据(如用户信息、订单记录)
特点:
- 轻量级嵌入式数据库,支持SQL语法
- 需手动管理版本升级、表结构变更
- 直接操作易出错,推荐使用ORM框架
数据库操作步骤:
- 创建/打开数据库:
SQLiteOpenHelper
- 执行CRUD操作:
rawQuery()
/execSQL()
- 关闭连接:
db.close()
Room持久库(SQLite封装)
适用场景:替代SQLite的现代化方案
特点:
- 编译时验证SQL正确性
- 自动生成Dao接口实现
- 支持LiveData观察数据变化
核心组件:
@Entity
:定义表结构@Dao
:声明数据库操作接口@Database
:配置数据库信息
示例代码:
@Entity public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; } @Dao public interface UserDao { @Insert void insert(User user); @Query("SELECT FROM User") List<User> getAll(); }
ContentProvider(跨应用数据共享)
适用场景:对外提供数据访问接口(如通讯录、媒体库)
特点:
- 通过URI标识数据
- 需实现
insert/update/delete/query
方法 - 可设置访问权限(
permission
属性)
标准URI格式:
content://com.example.app/tableName/#
DataStore(Jetpack新组件)
适用场景:替代SharedPreferences的现代方案
特点:
- 支持Protobuf数据类型(更高效)
- 自动处理数据冲突和版本迁移
- 提供Flow API实现响应式编程
类型选择:
Preferences DataStore
:键值对存储(类似SP)Proto DataStore
:自定义Protobuf消息存储
存储方式选择建议
数据特征 | 推荐方案 | 理由 |
---|---|---|
简单配置项 | SharedPreferences | 快速存取,无需序列化 |
结构化数据 | Room | 安全性高,开发效率高 |
跨应用共享 | ContentProvider | 标准接口,权限可控 |
大体积文件 | 文件存储 | 直接二进制操作,节省内存 |
高频读写 | DataStore | 异步处理,性能优化 |
相关问题与解答
Q1:如何在多进程间共享数据?
A1:使用ContentProvider
或ViewModel
配合LiveData
,ContentProvider通过Binder机制实现跨进程通信,而ViewModel需结合Singleton
模式或Application
作用域。
Q2:DataStore相比SharedPreferences有哪些优势?
A2:
- 类型安全:支持自定义数据类型(如Protobuf),避免类型转换错误
- 并发处理:内置事务机制,保证多线程操作一致性
- 性能优化:自动异步写入,减少主线程阻塞
- 扩展性:可轻松迁移到Proto DataStore支持复杂数据