上一篇
安卓开发存储数据
- 行业动态
- 2025-04-22
- 2
安卓开发中常见的数据存储方式
SharedPreferences(轻量级键值对)
适用场景:存储简单配置、用户偏好设置(如开关状态、主题模式)。
特点:
- 以键值对形式存储(支持
String
、int
、boolean
等基本类型)。 - 本质是XML文件,存储在应用私有目录。
- 读写操作简单,性能高。
- 以键值对形式存储(支持
示例代码:
// 写入数据 SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); sp.edit().putString("username", "John").apply(); // 读取数据 String username = sp.getString("username", "default");
文件存储(File)
适用场景:存储文本、二进制文件(如图片、视频、缓存文件)。
特点:
- 分为内部存储(应用私有,无需申请权限)和外部存储(需动态申请权限,Android 10后需适配分区存储)。
- 内部存储路径:
context.getFilesDir()
。 - 外部存储路径:
Environment.getExternalStorageDirectory()
(需注意权限)。
示例代码:
// 写入文件 File file = new File(getFilesDir(), "data.txt"); try (FileOutputStream fos = new FileOutputStream(file)) { fos.write("Hello".getBytes()); } // 读取文件 try (FileInputStream fis = new FileInputStream(file)) { int len; byte[] buffer = new byte[1024]; while ((len = fis.read(buffer)) != -1) { // 处理数据 } }
SQLite数据库(结构化数据)
适用场景:存储复杂关系型数据(如用户信息、订单列表)。
特点:
- 轻量级嵌入式数据库,支持SQL语法。
- 通过
SQLiteOpenHelper
管理数据库创建与升级。 - 适合频繁读写操作。
示例代码:
// 创建数据库帮助类 public class DBHelper extends SQLiteOpenHelper { public DBHelper(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)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 处理数据库升级 } }
ContentProvider(跨应用数据共享)
- 适用场景:共享数据给其他应用(如访问联系人、媒体库)。
- 特点:
- 通过URI标识数据,支持CRUD操作。
- 可自定义实现,但需处理权限和安全性。
- 示例代码:
// 查询联系人数据 Uri uri = ContactsContract.Contacts.CONTENT_URI; Cursor cursor = getContentResolver().query(uri, null, null, null, null); if (cursor != null) { while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); // 处理数据 } cursor.close(); }
网络存储(远程数据)
- 适用场景:存储需跨设备同步的数据(如用户登录信息、云端文件)。
- 特点:
- 依赖后端服务(如REST API、云数据库)。
- 需处理网络请求和数据同步逻辑。
- 示例工具:Retrofit、OkHttp、Firebase等。
存储方式对比表
存储方式 | 数据类型 | 持久化 | 复杂度 | 适用场景 |
---|---|---|---|---|
SharedPreferences | 键值对(简单类型) | 是 | 低 | 配置、偏好设置 |
文件存储 | 文本/二进制文件 | 是 | 中 | 缓存、多媒体、配置文件 |
SQLite数据库 | 结构化数据(表、关系) | 是 | 中高 | 复杂数据、搜索、关联查询 |
ContentProvider | 公开数据(跨应用) | 是 | 高 | 系统级数据共享(如联系人) |
网络存储 | 任意类型(依赖服务) | 是 | 高 | 跨设备同步、云端存储 |
相关问题与解答
问题1:如何根据数据类型选择合适的存储方式?
解答:
- 简单配置:使用
SharedPreferences
(如夜间模式开关)。 - 小文件/文本:使用文件存储(如JSON缓存、日志文件)。
- 结构化数据:使用SQLite(如用户信息表、订单记录)。
- 跨应用共享:使用
ContentProvider
(如访问系统相册)。 - 大文件/云端同步:使用网络存储(如上传图片到服务器)。
问题2:Android 10及以上系统的外部存储权限如何处理?
解答:
- 分区存储(Scoped Storage):Android 10后,外部存储分为“应用专属空间”和“共享空间”。
- 适配方法:
- 使用
MediaStore
API操作媒体文件(如图片、音频)。 - 申请
MANAGE_EXTERNAL_STORAGE
权限(需谨慎,仅必要场景使用)。 - 将文件存储在应用安装目录下的外部存储空间(
getExternalFilesDir()
)。
- 使用