安卓存储数据可通过内部/外部存储、SQLite数据库、SharedPreferences实现,应用间数据共享常采用ContentProvider或文件/数据库交互
SharedPreferences存储与共享
定义与用途
- 功能:以键值对形式存储轻量级配置信息(如用户偏好设置、登录状态)
- 数据类型:支持
String
、int
、float
、long
、boolean
、Set<String>
- 存储位置:
/data/data/<包名>/shared_prefs/
使用场景
- 用户设置(如主题模式、通知开关)
- 临时状态保存(如是否首次启动)
- 简单配置信息持久化
代码示例
// 写入数据
SharedPreferences sp = getSharedPreferences("app_config", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("username", "JohnDoe");
editor.putInt("age", 25);
editor.apply(); // 异步提交
// 读取数据
String username = sp.getString("username", "default");
int age = sp.getInt("age", 18);
多模式说明
模式常量 |
作用范围 |
适用场景 |
MODE_PRIVATE |
当前应用私有 |
默认模式 |
MODE_MULTI_PROCESS |
支持多进程共享 |
跨进程通信 |
MODE_WORLD_READABLE |
全系统可读 |
风险较高,谨慎使用 |
MODE_WORLD_WRITEABLE |
全系统可写 |
极少使用 |
文件存储共享
内部存储与外部存储
类型 |
路径 |
访问权限 |
适用场景 |
内部存储 |
/data/data/<包名>/files/ |
仅限本应用 |
敏感配置 |
外部存储 |
Environment.getExternalStorageDirectory() |
需申请WRITE_EXTERNAL_STORAGE 权限 |
媒体文件共享 |
文件操作示例
// 写入文件
File file = new File(getFilesDir(), "config.txt");
try (FileOutputStream fos = new FileOutputStream(file)) {
fos.write("key=value".getBytes());
}
// 读取文件
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
while ((line = reader.readLine()) != null) {
// 解析key=value格式
}
SQLite数据库共享
数据库设计要点
- 单例模式:通过
SQLiteOpenHelper
管理数据库连接
- 版本控制:
onUpgrade()
处理版本迁移
- 数据模型:使用
ContentValues
构建插入数据
跨应用共享方案
<!-在Manifest声明ContentProvider -->
<provider
android:name=".MyContentProvider"
android:authorities="com.example.provider"
android:exported="true" />
// ContentProvider实现示例
@Override
public Cursor query(Uri uri, String[] projection, Bundle selectionArgs) {
SQLiteDatabase db = mHelper.getReadableDatabase();
return db.query("users", projection, null, null, null, null, null);
}
ContentProvider数据共享
标准URI格式
content://[authority]/[path]/[ID]
- 示例:
content://com.example.provider/users/1
权限控制机制
MIME类型 |
操作权限 |
典型用途 |
vnd.android.cursor.dir/vnd.example.user |
目录查询 |
获取全部用户列表 |
vnd.android.cursor.item/vnd.example.user |
单条数据操作 |
CRUD操作 |
数据共享方式对比表
特性 |
SharedPreferences |
文件存储 |
SQLite |
ContentProvider |
数据结构 |
Key-Value |
文本/二进制 |
关系型 |
关系型+URI接口 |
访问粒度 |
全局配置 |
独立文件 |
表级 |
行级权限 |
跨应用共享 |
需特殊配置 |
需文件权限 |
需ContentProvider封装 |
原生支持 |
性能 |
毫秒级 |
依赖IO |
百毫秒级 |
网络延迟级别 |
相关问题与解答
Q1:如何选择数据存储方式?
A1:根据以下维度决策:

- 数据量:<1KB用SP,<1MB用文件,结构化用SQLite
- 共享需求:单应用用SP/文件,跨应用必须用CP
- 操作频率:高频写操作优先SP/内存缓存
- 数据结构:非结构化用文件,表格数据用SQLite
Q2:如何实现跨进程的实时数据同步?
A2:推荐组合方案:

- 底层存储:使用SQLite+ContentProvider
- 通知机制:通过
BroadcastReceiver
推送更新
- 监听注册:在
ContentObserver
中监控数据变化
- 事务处理:使用
ContentResolver.notifyChange()
触发同步
// 观察者注册示例
getContentResolver().registerContentObserver(
Uri.parse("content://com.example.provider/users"),
true, // 递归监听子节点
new ContentObserver(Handler.getMain()) {
@Override
public void onChange(boolean selfChange) {
// 刷新UI逻辑
}
}
);