上一篇
安卓开发中有哪三种数据存储方式
- 行业动态
- 2025-04-22
- 4
安卓三种存储方式:SharedPreferences存配置,SQLite存结构化数据,文件存储存多媒体等
安卓三种数据存储方式详解
SharedPreferences(共享偏好)
特点:
- 基于键值对存储(Key-Value)
- 仅支持基本数据类型(如
int
、float
、String
、boolean
等) - 数据以XML文件形式存储在应用私有目录
- 默认是异步提交,支持
apply()
同步提交
适用场景:
- 轻量级配置信息(如用户设置、登录状态)
- 少量简单数据的持久化
示例代码:
// 获取SharedPreferences对象 SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); // 写入数据 sp.edit() .putString("username", "admin") .putInt("age", 25) .apply(); // 提交修改 // 读取数据 String username = sp.getString("username", "default"); int age = sp.defaultAppConfig.getInt("age", 0);
优点:
- 简单易用,无需创建数据库或文件
- 自动处理数据序列化和反序列化
缺点:
- 仅支持简单数据类型,无法存储复杂对象
- 不适合大量数据存储
SQLite数据库
特点:
- 轻量级关系型数据库
- 数据以二维表形式存储,支持SQL查询
- 存储在应用私有目录(
/data/data/包名/databases/
) - 需手动创建和管理数据库及表结构
适用场景:
- 结构化数据存储(如用户信息、订单记录)
- 需要复杂查询或关联操作的场景
示例代码:
// 创建数据库帮助类 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)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} } // 增删改查操作 DBHelper dbHelper = new DBHelper(context); SQLiteDatabase db = dbHelper.getWritableDatabase(); db.execSQL("INSERT INTO user (name) VALUES ('Alice')"); Cursor cursor = db.query("user", null, null, null, null, null, null);
优点:
- 支持复杂数据结构和SQL操作
- 数据持久化,适合大量数据存储
缺点:
- 需要手动管理数据库生命周期
- 学习成本较高(需熟悉SQL语法)
文件存储(Internal/External Storage)
特点:
- 直接读写文件(如文本、二进制文件)
- 分为内部存储(应用私有)和外部存储(公共空间)
- 内部存储无需申请权限,外部存储需动态申请
WRITE_EXTERNAL_STORAGE
适用场景:
- 存储多媒体文件(图片、视频、音频)
- 缓存大型配置文件或日志文件
示例代码:
// 写入内部存储文件 File file = new File(getFilesDir(), "data.txt"); try (FileOutputStream fos = new FileOutputStream(file)) { fos.write("Hello World".getBytes()); } // 读取内部存储文件 byte[] buffer = new byte[1024]; try (FileInputStream fis = new FileInputStream(file)) { int len = fis.read(buffer); String content = new String(buffer, 0, len); }
优点:
- 支持任意格式文件(如JSON、XML、图片)
- 简单文件操作API,易于使用
缺点:
- 需自行处理文件路径和IO异常
- 外部存储受存储空间和权限限制
数据存储方式对比表
特性 | SharedPreferences | SQLite | 文件存储 |
---|---|---|---|
数据类型 | 基本类型 | 结构化数据 | 任意格式文件 |
持久性 | 是 | 是 | 是 |
操作复杂度 | 低 | 中 | 低(文件IO) |
适用场景 | 轻量配置 | 复杂数据 | 大文件/多媒体 |
存储容量 | 小 | 中等 | 大 |
线程安全 | 是 | 否(需加锁) | 否 |
相关问题与解答
问题1:如何根据数据类型选择合适的存储方式?
解答:
- 简单配置(如开关状态、用户名):使用
SharedPreferences
- 结构化数据(如用户表、订单记录):使用
SQLite
- 大文件或二进制数据(如图片、视频):使用文件存储
- 临时缓存(如Bitmap):可考虑内存缓存或
File
的缓存目录
问题2:SharedPreferences的commit()
和apply()
有什么区别?
解答:
commit()
:同步提交,返回boolean
表示成功/失败,会阻塞主线程。apply()
:异步提交,无返回值,不会阻塞主线程,性能更优。
建议:非必要情况优先使用apply()
,避免UI卡