上一篇
安卓存储方式
- 行业动态
- 2025-04-23
- 7
安卓存储方式包括内部存储(系统与应用数据)、外部存储(如SD卡)、SQLite数据库(结构化数据)、SharedPreferences(键值对配置)及网络云存储,支持本地与云端数据
安卓存储方式详解
内部存储(Internal Storage)
特点:
- 应用私有,其他应用或用户无法直接访问。
- 数据随应用卸载自动清除。
- 无需申请存储权限(如
WRITE_EXTERNAL_STORAGE
)。
适用场景:
存储敏感配置、缓存文件、临时数据。
操作方式:
// 写入内部存储 File file = new File(getFilesDir(), "config.txt"); FileOutputStream fos = new FileOutputStream(file); fos.write("data".getBytes()); fos.close(); // 读取内部存储 FileInputStream fis = new FileInputStream(file); BufferedReader reader = new BufferedReader(new InputStreamReader(fis)); String line = reader.readLine();
外部存储(External Storage)
- 特点:
- 可被用户或其他应用访问(需权限)。
- 数据不会随应用卸载自动删除。
- Android 10+ 需适配“分区存储”(Scoped Storage)。
- 适用场景:
媒体文件、下载内容、跨应用共享数据。
- 权限管理:
- 写入:
MANAGE_EXTERNAL_STORAGE
(Android 11+)或WRITE_EXTERNAL_STORAGE
(旧版本)。 - 读取:
READ_EXTERNAL_STORAGE
(Android 10+ 已废弃,改用MediaStore
API)。
- 写入:
- 操作示例:
// 写入公共外部存储(需权限) File publicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); File file = new File(publicDir, "image.jpg");
SQLite数据库
- 特点:
- 轻量级关系型数据库,支持SQL查询。
- 数据以文件形式存储在内部/外部存储中。
- 适用场景:
结构化数据存储(如用户信息、订单记录)。
- 操作步骤:
- 创建/打开数据库:
SQLiteOpenHelper
。 - 定义表结构并执行CRUD操作。
// 创建数据库帮助类 public class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context) { super(context, "app.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT)"); } // 其他方法省略 }
- 创建/打开数据库:
SharedPreferences
特点:
- 基于XML的键值对存储,接口简单。
- 适用于少量配置数据(如用户设置、登录状态)。
操作方式:
// 写入数据 SharedPreferences prefs = getSharedPreferences("config", MODE_PRIVATE); prefs.edit().putString("key", "value").apply(); // 读取数据 String value = prefs.getString("key", "default");
ContentProvider(内容提供者)
- 特点:
- 跨应用数据共享的标准接口。
- 支持URI定位数据,可自定义权限。
- 适用场景:
对外提供数据(如通讯录、媒体库)。
- 示例:
// 读取联系人数据 Uri uri = ContactsContract.Contacts.CONTENT_URI; Cursor cursor = getContentResolver().query(uri, null, null, null, null);
存储方式对比表
存储类型 | 数据持久性 | 访问权限 | 适用数据类型 | 典型用途 |
---|---|---|---|---|
内部存储 | 高(随应用) | 仅限本应用 | 文件、二进制数据 | 配置文件、缓存 |
外部存储 | 低(手动删除) | 所有应用/用户 | 媒体、大文件 | 图片、视频、文档 |
SQLite数据库 | 高 | 仅限本应用 | 结构化数据 | 用户信息、订单记录 |
SharedPreferences | 高 | 仅限本应用 | 键值对(字符串、布尔等) | 用户设置、登录状态 |
ContentProvider | 依赖实现 | 可自定义 | 多种(通过URI) | 跨应用数据共享 |
相关问题与解答
问题1:如何选择不同的存储方式?
解答:
- 敏感数据(如用户token):优先使用内部存储或加密SQLite。
- 大量非敏感数据(如图片):使用外部存储或云存储。
- 简单配置(如开关状态):使用SharedPreferences。
- 跨应用共享:通过ContentProvider或外部存储(需处理权限)。
问题2:Android 10+的分区存储如何影响外部存储?
解答:
- 限制:应用默认只能访问自身创建的文件或媒体库中的文件。
- 解决方案:
- 使用
MediaStore
API保存媒体文件。 - 请求
MANAGE_EXTERNAL_STORAGE
权限(需谨慎,可能被拒审)。 - 引导用户手动授权特定文件访问(不推荐
- 使用