上一篇
安卓如何存储什么
- 行业动态
- 2025-04-23
- 4125
安卓通过内部存储(私有数据)、外部 存储(SD卡/USB)、SQLite 数据库、SharedPreferences(键值对)及网络存储(云服务)等方式,存储应用数据、媒体文件、用户配置、缓存信息等
安卓存储机制详解
安卓存储类型分类
存储类型 | 特点 | 典型用途 |
---|---|---|
内部存储 | 应用私有空间,无需申请权限,数据随应用卸载自动删除 | 配置文件、缓存文件、敏感数据 |
外部存储 | 公共空间(需申请权限),数据可能被用户或其他应用访问 | 媒体文件、日志、大文件存储 |
SQLite数据库 | 轻量级关系型数据库,支持SQL语句操作 | 结构化数据持久化存储 |
SharedPreferences | 基于XML的键值对存储,本质是简化版数据库 | 轻量级配置信息 |
文件存储 | 直接读写文件系统,支持多种格式(txt/json/binary等) | 文本记录、二进制文件、资源文件 |
缓存机制 | 临时存储(如内存缓存、磁盘缓存),系统可自动清理 | 频繁访问的临时数据 |
具体存储方式实现
- 内部存储操作
// 写入文本文件 val file = File(context.filesDir, "config.txt") file.writeText("key=value")
// 读取文件
val content = file.readText()
2. 外部存储操作(Android 10+)
```kotlin
// 写入公共下载目录
val file = File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "log.txt")
file.writeText("App Log")
// 读取需处理Scoped Storage限制
- SQLite数据库操作
// 创建数据库 val db = SQLiteOpenHelper(context, "app.db", null).writableDatabase
// 增删改查
db.execSQL(“CREATE TABLE user(id INTEGER PRIMARY KEY)”)
db.insert(“user”, null, mapOf(“id” to 1))
4. SharedPreferences使用
```kotlin
// 写入配置
getSharedPreferences("settings", MODE_PRIVATE).edit().putString("theme", "dark").apply()
// 读取配置
val theme = getSharedPreferences("settings", MODE_PRIVATE).getString("theme", "light")
存储方式对比表
特性 | SharedPreferences | SQLite | 文件存储 | 内部存储 | 外部存储 |
---|---|---|---|---|---|
数据格式 | 键值对(String/int等) | 关系型表结构 | 自由格式 | 同文件存储 | 同文件存储 |
操作复杂度 | |||||
适用场景 | 轻量级配置 | 复杂业务数据 | 非结构化数据 | 所有类型 | 大文件/媒体 |
数据安全 | 中等(可备份) | 高(可加密) | 低(易被读取) | 高(私有) | 低(公共) |
存储容量 | 无限制(受设备限制) | 无限制 | 无限制 | 受限于设备内存 | 受限于存储卡空间 |
关键注意事项
权限管理
- 外部存储需动态申请
MANAGE_EXTERNAL_STORAGE
(Android 11+)或WRITE_EXTERNAL_STORAGE
(旧版本) - 访问其他应用文件需
READ_EXTERNAL_STORAGE
- 外部存储需动态申请
数据兼容性
- 使用
MMKV
等第三方库实现跨进程/多端数据同步 - SQLite数据库升级需处理版本迁移逻辑
- 使用
性能优化
- 频繁读写使用
MemoryCache
(如LruCache) - 大文件分块读写(避免主线程阻塞)
- 频繁读写使用
常见问题与解答(Q&A)
Q1:如何选择SharedPreferences和SQLite?
A:若数据为简单键值对(如用户设置、开关状态),优先使用SharedPreferences;若涉及多表关联、复杂查询(如订单管理、聊天记录),则选择SQLite。
Q2:如何在Android 10+上安全访问外部存储?
A:1)使用MediaStore API
操作媒体文件;2)通过Storage Access Framework
获取URI;3)将文件存储在app-specific directory
(如getExternalFilesDir()
返回路径