上一篇
安卓开发 数据存储
- 行业动态
- 2025-04-21
- 9
安卓开发数据存储详解
SharedPreferences(轻量级键值对存储)
核心特点
- 基于XML文件存储
- 适合少量简单配置数据(如用户偏好设置)
- 提供
getDefaultSharedPreferences()
和自定义文件名两种方式
操作步骤
- 获取
SharedPreferences
对象SharedPreferences sp = getSharedPreferences("config", Context.MODE_PRIVATE);
- 通过
Editor
进行数据修改SharedPreferences.Editor editor = sp.edit(); editor.putString("username", "John"); editor.apply(); // 异步提交
- 读取数据
String name = sp.getString("username", "default_value");
适用场景
- 用户登录状态保存
- 应用设置项(如主题模式、音量)
- 少量永久配置数据
文件存储(私有/公有文件系统)
核心特点
- 支持任意类型文件(文本、图片、音视频)
- 通过
File
或FileOutputStream
操作 - 默认存储路径:
/data/data/包名/files/
(私有)或Environment.getExternalStorageDirectory()
(公有)
操作步骤
- 私有文件写入
File file = new File(getFilesDir(), "data.txt"); try (FileOutputStream fos = new FileOutputStream(file)) { fos.write("Hello".getBytes()); }
- 公有文件读写(需动态申请WRITE_EXTERNAL_STORAGE权限)
File publicFile = new File(getExternalFilesDir(null), "log.txt");
适用场景
- 临时缓存文件(如图片缩略图)
- 下载的文件存储
- 日志文件记录
SQLite数据库(结构化数据存储)
核心特点
- 轻量级关系型数据库
- 支持SQL语句操作
- 最大限制:数据库大小约10MB(实际受设备存储限制)
操作步骤
- 创建数据库帮助类
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)"); } }
- 增删改查操作
// 插入数据 SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("INSERT INTO user(name) VALUES(?)", new Object[]{"Alice"});
适用场景
- 复杂业务数据(如订单、用户信息)
- 需要事务支持的操作
- 多表关联查询场景
ContentProvider(跨应用数据共享)
核心特点
- 标准URI接口(如
content://contacts/people
) - 支持CRUD操作
- 可配置权限(
android:permission
)
操作步骤
- 定义
ContentProvider
子类public class MyProvider extends ContentProvider { @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // 实现更新逻辑 return 1; } }
- 在Manifest中注册
<provider android:name=".MyProvider" android:authorities="com.example.provider"/>
适用场景
- 共享媒体文件(如图片、音乐)
- 第三方应用数据交换(如通讯录)
- 系统级服务数据暴露
网络存储(云端数据同步)
核心特点
- 依赖网络请求(HTTP/HTTPS)
- 通常结合RESTful API或WebSocket
- 需要处理网络状态和数据加密
操作步骤
- 使用Retrofit发起请求
public interface ApiService { @POST("/users") Call<ResponseBody> createUser(@Body User user); }
- 处理JSON数据(结合Gson)
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .build();
适用场景
- 用户账号数据同步
- 远程配置文件获取
- 实时数据更新(如聊天消息)
数据存储方式对比表
存储类型 | 数据结构 | 性能 | 安全性 | 适用场景 |
---|---|---|---|---|
SharedPreferences | Key-Value | 高 | 中等(可加密) | 简单配置项 |
文件存储 | 二进制/文本 | 中等 | 低(需权限控制) | 多媒体文件、日志 |
SQLite | 关系型 | 中等 | 高(本地可控) | 复杂业务数据 |
ContentProvider | 表结构 | 低(跨进程) | 可配置 | 跨应用数据共享 |
网络存储 | JSON/Protobuf | 依赖网络 | 高(需加密传输) | 云端同步、实时数据交互 |
相关问题与解答
问题1:如何选择Android数据存储方式?
解答:根据数据特性和需求选择:
- 简单配置 → SharedPreferences
- 文件资源 → 文件存储(注意私有/公有路径)
- 结构化数据 → SQLite(或Room抽象层)
- 跨应用共享 → ContentProvider
- 云端同步 → 网络存储(需处理离线缓存)
问题2:如何保证SQLite数据库的安全性?
解答:
- 权限控制:设置
android:protectionLevel
为signature
限制访问范围 - 数据加密:使用AES加密敏感字段(如密码)
- 文件保护:将数据库文件设置为
MODE_PRIVATE
并检查文件权限 - 备份策略:通过
BackupAgent
实现自动备份到云端