当前位置:首页 > 行业动态 > 正文

安卓存储对象

安卓存储对象含SharedPreferences、文件、SQLite及内容提供者,分别用于配置、文件数据、结构化数据与跨应用

安卓存储对象详解


内部存储(Internal Storage)

特点

  • 应用私有,数据仅当前应用可访问
  • 无需申请存储权限
  • 数据随应用卸载自动删除

适用场景

  • 存储敏感配置、缓存文件、小体积资源

操作步骤

  1. 调用 context.getFilesDir() 获取文件目录
  2. 使用 FileOutputStream 写入文件
  3. 通过 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_STORAGEWRITE_EXTERNAL_STORAGE 权限
  • Android 10+ 对非媒体文件限制访问

适用场景

安卓存储对象

  • 存储媒体文件(图片、视频)、共享文档

操作步骤

  1. 申请权限(Android 6.0+)
  2. 使用 getExternalFilesDir() 获取应用专属目录
  3. 通过 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
  • 兼容方案
    1. 使用 getExternalFilesDir() 获取应用专属目录(无需权限)。
    2. 通过 Storage Access Framework(SAF)访问用户选定的文件。
    3. 将文件存储至应用安装的外部存储分区(如 Android/data/包名)。