当前位置:首页 > 行业动态 > 正文

安卓存储对象到本地

安卓存储对象到本地可通过SharedPreferences(键值对)、文件IO(文本/二进制)、SQLite/Room数据库或序列化对象到文件实现,需注意内部存储(自动清理)与外部存储(需权限)的区别,复杂对象建议使用Gson/JSON序列化后存储

安卓本地存储方式

安卓系统提供了多种本地存储方案,开发者可根据数据类型、存储需求、性能要求等选择合适方式,以下是常见的存储对象到本地的实现方案:


具体存储方案与实现

SharedPreferences(键值对存储)

适用场景:轻量级配置信息、简单数据(如用户设置、登录状态)
特点:基于XML文件,支持putString()putInt()等基础数据类型,需手动序列化对象。

存储对象步骤

  1. 将对象转为JSON字符串(需引入Gson/Jackson等库)
  2. 调用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();

读取对象步骤

  1. 通过getString()获取JSON字符串
  2. 使用Gson反序列化
String json = sp.getString("user_data", "");
User user = new Gson().fromJson(json, User.class);

文件存储(内部/外部存储)

适用场景:大文本文件、二进制文件(如图片、视频)、复杂对象持久化
特点:需处理文件路径、序列化逻辑,支持InternalStorage(私有)和ExternalStorage(公有)。

安卓存储对象到本地

存储对象步骤

  1. 将对象序列化为JSON/XML或二进制
  2. 通过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());
}

读取对象步骤

  1. 通过FileInputStream读取文件内容
  2. 反序列化字符串为对象
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数据库(结构化存储)

适用场景:复杂数据关系、频繁查询、事务操作
特点:需手动创建表结构,适合存储多个对象实例。

安卓存储对象到本地

存储对象步骤

  1. 创建数据库表(如users表)
  2. 将对象属性映射为表字段
// 示例:插入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);

读取对象步骤

  1. 执行SELECT查询
  2. 手动封装结果为对象
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协程,需配置PreferenceDataStoreProtoDataStore

安卓存储对象到本地

存储对象示例

// 使用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:如何选择存储方式?

解答

  • 轻量级配置:优先使用DataStoreSharedPreferences
  • 复杂对象/多实例:选择SQLite或文件存储(如序列化JSON)。
  • 大文件:必须使用文件存储(如图片、视频)。
  • 高频率读写DataStore支持异步操作,性能更优。

问题2:如何存储包含嵌套对象的复杂数据?

解答

  1. 文件存储:将嵌套对象整体序列化为JSON(推荐使用Gson/Moshi)。
  2. SQLite:拆分嵌套对象为关联表(如用户表与地址表),或使用TypeConverter(配合Room)。
  3. DataStore:定义.proto文件描述嵌套结构,通过协议缓冲