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

安卓开发过程中如何保存数据

安卓数据存储方式详解

SharedPreferences(轻量级键值对)

适用场景:存储简单配置项(如用户偏好、登录状态)
特点

  • 基于XML文件,以键值对形式存储
  • 支持int/float/String/boolean/Set等基础类型
  • 异步提交(apply())或同步提交(commit()

示例代码

// 获取实例
SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
// 写入数据
sp.edit()
  .putString("username", "John")
  .putBoolean("isLoggedIn", true)
  .apply();
// 读取数据
String name = sp.getString("username", "default");

文件存储(原始文件操作)

适用场景:存储文本/二进制文件(如日志、图片缓存)
特点

  • 分为内部存储(getFilesDir())和外部存储(需申请权限)
  • 需处理文件读写权限(Android 10+作用域存储限制)
  • 适合临时数据或媒体文件

存储位置对比
| 存储类型 | 路径示例 | 是否需要权限 | 数据存活性 |
|———-|———-|————–|————|
| 内部存储 | /data/data/包名/files/ | 否 | 应用卸载即删 |
| 外部存储 | /storage/emulated/0/ | 是(Android 6+) | 手动删除 |

SQLite数据库(结构化存储)

适用场景:复杂关系型数据(如用户信息、订单记录)
特点

  • 轻量级嵌入式数据库,支持SQL语法
  • 需手动管理版本升级、表结构变更
  • 直接操作易出错,推荐使用ORM框架

数据库操作步骤

  1. 创建/打开数据库:SQLiteOpenHelper
  2. 执行CRUD操作:rawQuery()/execSQL()
  3. 关闭连接:db.close()

Room持久库(SQLite封装)

适用场景:替代SQLite的现代化方案
特点

  • 编译时验证SQL正确性
  • 自动生成Dao接口实现
  • 支持LiveData观察数据变化

核心组件

  • @Entity:定义表结构
  • @Dao:声明数据库操作接口
  • @Database:配置数据库信息

示例代码

@Entity
public class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    public String name;
}
@Dao
public interface UserDao {
    @Insert
    void insert(User user);
    @Query("SELECT  FROM User")
    List<User> getAll();
}

ContentProvider(跨应用数据共享)

适用场景:对外提供数据访问接口(如通讯录、媒体库)
特点

  • 通过URI标识数据
  • 需实现insert/update/delete/query方法
  • 可设置访问权限(permission属性)

标准URI格式

content://com.example.app/tableName/#

DataStore(Jetpack新组件)

适用场景:替代SharedPreferences的现代方案
特点

  • 支持Protobuf数据类型(更高效)
  • 自动处理数据冲突和版本迁移
  • 提供Flow API实现响应式编程

类型选择

  • Preferences DataStore:键值对存储(类似SP)
  • Proto DataStore:自定义Protobuf消息存储

存储方式选择建议

数据特征 推荐方案 理由
简单配置项 SharedPreferences 快速存取,无需序列化
结构化数据 Room 安全性高,开发效率高
跨应用共享 ContentProvider 标准接口,权限可控
大体积文件 文件存储 直接二进制操作,节省内存
高频读写 DataStore 异步处理,性能优化

相关问题与解答

Q1:如何在多进程间共享数据?
A1:使用ContentProviderViewModel配合LiveData,ContentProvider通过Binder机制实现跨进程通信,而ViewModel需结合Singleton模式或Application作用域。

Q2:DataStore相比SharedPreferences有哪些优势?
A2:

  1. 类型安全:支持自定义数据类型(如Protobuf),避免类型转换错误
  2. 并发处理:内置事务机制,保证多线程操作一致性
  3. 性能优化:自动异步写入,减少主线程阻塞
  4. 扩展性:可轻松迁移到Proto DataStore支持复杂数据
0