上一篇
安卓存储对象到本地
- 行业动态
- 2025-04-23
- 9
安卓存储对象到本地可通过SharedPreferences(键值对)、文件IO(文本/二进制)、SQLite/Room数据库或序列化对象到文件实现,需注意内部存储(自动清理)与外部存储(需权限)的区别,复杂对象建议使用Gson/JSON序列化后存储
安卓本地存储方式
安卓系统提供了多种本地存储方案,开发者可根据数据类型、存储需求、性能要求等选择合适方式,以下是常见的存储对象到本地的实现方案:
具体存储方案与实现
SharedPreferences(键值对存储)
适用场景:轻量级配置信息、简单数据(如用户设置、登录状态)
特点:基于XML文件,支持putString()
、putInt()
等基础数据类型,需手动序列化对象。
存储对象步骤:
- 将对象转为JSON字符串(需引入Gson/Jackson等库)
- 调用
edit().putString().apply()
保存
// 示例:存储User对象 SharedPreferences sp = getSharedPreferences("app_config", MODE_PRIVATE); User user = new User("Alice", 25); String json = new Gson().toJson(user); // 需添加Gson依赖 sp.edit().putString("user_data", json).apply();
读取对象步骤:
- 通过
getString()
获取JSON字符串 - 使用Gson反序列化
String json = sp.getString("user_data", ""); User user = new Gson().fromJson(json, User.class);
文件存储(内部/外部存储)
适用场景:大文本文件、二进制文件(如图片、视频)、复杂对象持久化
特点:需处理文件路径、序列化逻辑,支持InternalStorage
(私有)和ExternalStorage
(公有)。
存储对象步骤:
- 将对象序列化为JSON/XML或二进制
- 通过
FileOutputStream
写入文件
// 示例:存储对象为JSON文件 User user = new User("Bob", 30); File file = new File(getFilesDir(), "user.json"); try (FileOutputStream fos = new FileOutputStream(file)) { String json = new Gson().toJson(user); fos.write(json.getBytes()); }
读取对象步骤:
- 通过
FileInputStream
读取文件内容 - 反序列化字符串为对象
File file = new File(getFilesDir(), "user.json"); try (FileInputStream fis = new FileInputStream(file)) { byte[] bytes = new byte[(int) fis.available()]; fis.read(bytes); String json = new String(bytes); User user = new Gson().fromJson(json, User.class); }
SQLite数据库(结构化存储)
适用场景:复杂数据关系、频繁查询、事务操作
特点:需手动创建表结构,适合存储多个对象实例。
存储对象步骤:
- 创建数据库表(如
users
表) - 将对象属性映射为表字段
// 示例:插入User对象到SQLite SQLiteDatabase db = SQLiteOpenHelper.getInstance().getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", user.getName()); values.put("age", user.getAge()); db.insert("users", null, values);
读取对象步骤:
- 执行
SELECT
查询 - 手动封装结果为对象
Cursor cursor = db.query("users", null, "id=?", new String[]{"1"}); if (cursor.moveToFirst()) { User user = new User( cursor.getString(cursor.getColumnIndex("name")), cursor.getInt(cursor.getColumnIndex("age")) ); }
DataStore(Jetpack推荐)
适用场景:替代SharedPreferences,支持类型安全、异步操作
特点:基于Kotlin协程,需配置PreferenceDataStore
或ProtoDataStore
。
存储对象示例:
// 使用ProtoDataStore存储对象 val dataStore = DataStoreFactory.createProtoDataStore(context) val userProto = UserProto.User.newBuilder() .setName("Charlie") .setAge(28) .build() dataStore.edit { settings -> settings[KEY_USER] = userProto.toByteArray() }
存储方案对比表
存储方式 | 数据格式 | 适用场景 | 是否需要序列化 | 支持查询 |
---|---|---|---|---|
SharedPreferences | Key-Value(原始类型) | 简单配置、轻量级数据 | 是(对象需转JSON) | 否 |
文件存储 | 文本/二进制 | 大文件、复杂对象 | 是 | 否 |
SQLite | 关系型表结构 | 多对象关联、复杂查询 | 否(直接存字段) | 是 |
DataStore | 协议缓冲/键值对 | 现代安卓应用配置(替代SP) | 是(Proto/JSON) | 否 |
相关问题与解答
问题1:如何选择存储方式?
解答:
- 轻量级配置:优先使用
DataStore
或SharedPreferences
。 - 复杂对象/多实例:选择
SQLite
或文件存储(如序列化JSON)。 - 大文件:必须使用文件存储(如图片、视频)。
- 高频率读写:
DataStore
支持异步操作,性能更优。
问题2:如何存储包含嵌套对象的复杂数据?
解答:
- 文件存储:将嵌套对象整体序列化为JSON(推荐使用Gson/Moshi)。
- SQLite:拆分嵌套对象为关联表(如用户表与地址表),或使用
TypeConverter
(配合Room)。 - DataStore:定义
.proto
文件描述嵌套结构,通过协议缓冲