上一篇
安卓存储对象
- 行业动态
- 2025-04-23
- 9
安卓存储对象含SharedPreferences、文件、SQLite及内容提供者,分别用于配置、文件数据、结构化数据与跨应用
安卓存储对象详解
内部存储(Internal Storage)
特点:
- 应用私有,数据仅当前应用可访问
- 无需申请存储权限
- 数据随应用卸载自动删除
适用场景:
- 存储敏感配置、缓存文件、小体积资源
操作步骤:
- 调用
context.getFilesDir()
获取文件目录 - 使用
FileOutputStream
写入文件 - 通过
context.openFileInput()
读取文件
示例代码(Kotlin):
// 写入文件 val file = File(context.filesDir, "config.txt") file.writeText("key=value") // 读取文件 val content = context.openFileInput("config.txt").bufferedReader().use { it.readText() }
外部存储(External Storage)
特点:
- 公有目录,其他应用可访问(需权限)
- 需动态申请
READ_EXTERNAL_STORAGE
和WRITE_EXTERNAL_STORAGE
权限 - Android 10+ 对非媒体文件限制访问
适用场景:
- 存储媒体文件(图片、视频)、共享文档
操作步骤:
- 申请权限(Android 6.0+)
- 使用
getExternalFilesDir()
获取应用专属目录 - 通过
MediaStore
操作媒体文件
示例代码(Kotlin):
// 申请权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_CODE) } // 写入文件到公有目录 val publicFile = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "image.jpg") publicFile.writeBytes(byteArray)
数据库存储(SQLite/Room)
特点:
- 结构化数据存储,支持增删改查
- Room 提供抽象层,简化 SQLite 操作
- 数据持久化,应用卸载后仍可保留(需备份)
适用场景:
- 复杂数据关系、高频读写操作
Room 示例代码(Kotlin):
// 定义实体 @Entity data class User( @PrimaryKey val id: Int, val name: String ) // 定义 DAO @Dao interface UserDao { @Insert suspend fun insert(user: User) @Query("SELECT FROM User") suspend fun getAllUsers(): List<User> } // 使用数据库 val db = Room.databaseBuilder(context, AppDatabase::class.java, "app_db").build() val users = db.userDao().getAllUsers()
SharedPreferences
特点:
- 轻量级键值对存储,适合简单配置
- 应用私有,数据以XML形式保存
- 支持默认值机制
适用场景:
- 用户偏好设置、登录状态保存
示例代码(Kotlin):
// 写入数据 val prefs = context.getSharedPreferences("app_prefs", Context.MODE_PRIVATE) prefs.edit().putString("username", "JohnDoe").apply() // 读取数据 val username = prefs.getString("username", "default_user")
网络存储(Retrofit/OkHttp + Web API)
特点:
- 依赖网络,适合跨设备同步数据
- 通常结合云端数据库(如 Firebase)或自定义服务端
- 需处理网络请求生命周期和错误
适用场景:
- 多端同步、大文件存储、实时数据更新
存储方式对比表
存储类型 | 数据类型 | 权限需求 | 生命周期 | 适用场景 |
---|---|---|---|---|
内部存储 | 任意文件 | 无 | 应用卸载即删 | 配置文件、临时缓存 |
外部存储 | 媒体文件、文档 | Android 6.0+动态权限 | 用户可手动清理 | 图片、视频、共享文件 |
SQLite/Room | 结构化数据 | 无 | 持久化 | 复杂数据、高频查询 |
SharedPreferences | 键值对(字符串/布尔等) | 无 | 应用卸载即删 | 用户偏好、简单配置 |
网络存储 | 任意数据(依赖API) | 互联网权限 | 依赖服务端策略 | 跨设备同步、大数据分析 |
相关问题与解答
问题1:如何根据数据类型选择存储方式?
解答:
- 简单配置(如用户设置):
SharedPreferences
- 小文件/敏感数据(如缓存):内部存储
- 媒体文件(如图片、视频):外部存储或网络存储(如云盘)
- 结构化数据(如用户信息表):SQLite/Room
- 跨设备同步数据:网络存储(需搭配云端服务)
问题2:Android 10+ 对外部存储有何限制?如何兼容?
解答:
- 限制:非媒体文件无法直接写入公有目录,需使用
Scoped Storage
。 - 兼容方案:
- 使用
getExternalFilesDir()
获取应用专属目录(无需权限)。 - 通过
Storage Access Framework
(SAF)访问用户选定的文件。 - 将文件存储至应用安装的外部存储分区(如
Android/data/包名
)。
- 使用