上一篇
安卓中的5种存储方式
- 行业动态
- 2025-04-23
- 3048
安卓5种存储方式:SharedPreferences存配置,文件存储持久化,SQLite管结构化数据,网络传数据,ContentProvider共享数据
SharedPreferences
特点:基于键值对的轻量级存储,本质是XML文件,适合保存简单配置信息(如用户设置、登录状态)。
操作方法:
- 获取实例:
SharedPreferences sp = context.getSharedPreferences("filename", MODE_PRIVATE);
- 存储数据:
sp.edit().putString("key", "value").apply();
- 读取数据:
sp.getString("key", defaultValue);
优点:操作简单,性能高。
缺点:仅支持基本数据类型,不适合复杂数据。
文件存储
特点:直接在设备内部或外部存储中读写文件(如文本、图片、音频),适合存储任意格式的原始数据。
操作方法:
- 内部存储:
File file = new File(context.getFilesDir(), "filename");
- 外部存储:需申请
WRITE_EXTERNAL_STORAGE
权限,路径为Environment.getExternalStorageDirectory()
。 - 写入文件:
FileOutputStream fos = new FileOutputStream(file);
优点:灵活,支持多种文件类型。
缺点:需处理文件路径和权限,管理复杂。
SQLite数据库
特点:轻量级关系型数据库,适合结构化数据(如用户信息、订单列表)。
操作方法:
- 创建数据库:
SQLiteOpenHelper
辅助类。 - 增删改查:通过
SQLiteDatabase
对象执行SQL语句。// 示例:创建表 db.execSQL("CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT);"); // 插入数据 db.execSQL("INSERT INTO user (name) VALUES (?)", new String[]{"Alice"});
优点:支持复杂查询,数据一致性高。
缺点:需手动管理数据库版本和SQL语句。
ContentProvider
特点:跨应用数据共享机制,通过URI统一访问接口(如读取联系人、访问媒体库)。
操作方法:
- 自定义Provider:继承
ContentProvider
,重写query/insert/update/delete
方法。 - 使用系统Provider:
Uri uri = ContactsContract.Contacts.CONTENT_URI;
// 示例:查询联系人 Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
优点:安全共享数据,支持权限控制。
缺点:实现复杂,需处理URI和数据转换。
网络存储
特点:将数据上传至服务器或云存储(如Firebase、REST API),实现跨设备同步。
操作方法:
- 使用
Retrofit
或OkHttp
发送HTTP请求。 - 云存储示例(Firebase):
FirebaseStorage reference = FirebaseStorage.getInstance().getReference();
优点:数据可跨平台共享,持久化强。
缺点:依赖网络,需处理异步和异常。
存储方式对比表
存储方式 | 数据类型 | 持久性 | 适用场景 | 权限需求 |
---|---|---|---|---|
SharedPreferences | 键值对(基本类型) | 是 | 简单配置、状态保存 | 无(仅限本应用) |
文件存储 | 任意格式文件 | 是 | 图片、视频、日志 | 存储权限(外部) |
SQLite数据库 | 结构化数据(表) | 是 | 复杂查询、业务数据 | 无(仅限本应用) |
ContentProvider | 公开数据(URI接口) | 是 | 跨应用共享(如联系人、文件) | 对应Provider权限 |
网络存储 | 远程数据(JSON/文件) | 否 | 跨设备同步、云端备份 | 网络权限 |
问题与解答
问题1:如何选择SharedPreferences和SQLite?
解答:若数据是简单键值对(如用户设置、开关状态),优先用SharedPreferences;若涉及多表关联、复杂查询(如用户信息+订单列表),则选择SQLite。
问题2:ContentProvider能否访问其他应用的私有文件?
解答:不能,ContentProvider仅能共享自身应用或系统公开的数据(如媒体库),访问其他应用的私有文件需通过文件共享机制(如FileProvider
)或对方应用主动暴露接口