上一篇
安卓开发数据都是存在哪里的
- 行业动态
- 2025-04-22
- 3
安卓数据存储的主要位置
内部存储(Internal Storage)
- 路径:
/data/data/<包名>/
- 特点:
- 应用私有,其他应用无法访问
- 无需申请存储权限
- 卸载应用时自动清除
- 适用场景:
- 存储敏感配置信息
- 缓存应用专属数据
- 操作方式:
// 写入内部存储 File file = new File(getFilesDir(), "config.txt"); // 读取内部存储 File file = new File(getFilesDir(), "config.txt");
外部存储(External Storage)
- 路径:
- 传统路径:
/mnt/sdcard/
或Environment.getExternalStorageDirectory()
- Android 10+:
/storage/emulated/0/
- 传统路径:
- 特点:
- 可被用户通过文件管理器访问
- 需要动态申请
WRITE_EXTERNAL_STORAGE
权限(Android 10+需特殊处理) - 可能被用户手动删除
- 适用场景:
- 媒体文件(图片、视频、文档)
- 应用间共享文件
- 操作限制:
- Android 10+ 启用Scoped Storage,应用只能访问自己的专属目录
- 需处理
ScopedFS
兼容性问题
SQLite数据库
- 路径:
/data/data/<包名>/databases/
- 特点:
- 轻量级关系型数据库
- 支持SQL语句操作
- 默认仅限本应用访问
- 操作方式:
// 创建数据库 SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase("app.db", null); // 执行SQL db.execSQL("CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT)");
SharedPreferences
- 存储位置:
/data/data/<包名>/shared_prefs/
- 特点:
- 键值对存储(支持
String
/Int
/Boolean
等基本类型) - 异步提交优化
- 自动序列化对象(需实现
Parcelable
)
- 键值对存储(支持
- 适用场景:
轻量级配置信息(如用户设置、登录状态)
- 操作示例:
// 写入 SharedPreferences prefs = getSharedPreferences("config", MODE_PRIVATE); prefs.edit().putString("key", "value").apply(); // 读取 String value = prefs.getString("key", "default");
缓存(Cache)
- 路径:
- 内存缓存:
LruCache
/BitmapCache
- 磁盘缓存:
getCacheDir()
→/data/data/<包名>/cache/
- 内存缓存:
- 特点:
- 系统可自动清理(如内存不足时)
- 适合临时数据(如图片缓存、网络响应)
- 操作注意:
- 需处理
onTrimMemory()
回调 - 避免存储关键业务数据
- 需处理
数据存储方式对比表
存储类型 | 持久性 | 访问范围 | 适用数据类型 | 典型API |
---|---|---|---|---|
内部存储 | 高 | 本应用 | 任意文件类型 | getFilesDir() /openFileOutput() |
外部存储 | 中 | 所有应用(需权限) | 媒体文件、文档 | getExternalFilesDir() |
SQLite数据库 | 高 | 本应用 | 结构化数据 | SQLiteDatabase |
SharedPreferences | 高 | 本应用 | 键值对(<1MB) | getSharedPreferences() |
缓存 | 低 | 本应用 | 临时文件/内存数据 | getCacheDir() /LruCache |
网络存储 | 可配置 | 服务器端 | 任意类型(需序列化) | Retrofit /OkHttp |
相关问题与解答
Q1:如何选择内部存储与外部存储?
A:根据数据敏感性和共享需求:
- 内部存储:存储敏感数据(如用户token)、应用核心配置,避免被其他应用或用户直接访问。
- 外部存储:存储媒体文件(如图片、视频)、需要跨设备同步或用户可管理的文件。
- 注意:Android 10+ 对外部存储有严格限制,建议优先使用
MediaStore
API或应用专属外部存储目录。
Q2:如何保护SQLite数据库的安全性?
A:
- 文件加密:使用AES加密数据库文件(如
SQLCipher
库)。 - 权限控制:设置数据库文件为
MODE_PRIVATE
,避免其他应用访问。 - 密钥管理:将加密密钥存储在
Keystore
系统,而非硬编码。 - 备份防护:禁用自动备份(
android:allowBackup="false"
)或加密备份数据