上一篇
安卓存储数据 share
- 行业动态
- 2025-04-23
- 8
安卓存储数据可通过内部/外部存储、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逻辑 } } );