特点:基于XML文件,适合存储少量简单配置数据(如用户偏好设置、登录状态等)。
数据结构:Map<String, Object>
,支持boolean
、int
、float
、long
、String
、Set<String>
。
持久化:默认持久化到设备存储,无需手动提交。
示例代码:
// 写入数据 SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.putString("username", "admin"); editor.apply(); // 异步提交 // 读取数据 String username = sp.getString("username", "default_value");
特点:适合存储任意格式文件(如文本、图片、音频等),需自行管理文件路径和读写逻辑。
数据结构:自由格式,支持InputStream
/OutputStream
操作。
持久化:手动调用flush()
或关闭流后生效。
示例代码:
// 写入文本文件 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); }
特点:适合存储复杂关系型数据(如用户信息表、订单表等),需手动创建和管理数据库。
数据结构:表格形式,支持SQL语句操作。
持久化:自动持久化,需显式提交事务。
示例代码:
// 创建数据库和表 SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase("app.db", null); db.execSQL("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)"); // 插入数据 ContentValues values = new ContentValues(); values.put("name", "Alice"); db.insert("users", null, values); // 查询数据 Cursor cursor = db.query("users", null, null, null, null, null, null); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); } cursor.close(); db.close();
特点:Android系统级组件,支持多进程数据共享(如访问联系人、媒体库)。
数据结构:基于URI标识数据,通过ContentResolver
操作。
持久化:依赖提供数据的一方管理。
示例代码:
// 读取联系人数据 ContentResolver resolver = getContentResolver(); Uri uri = ContactsContract.Contacts.CONTENT_URI; Cursor cursor = resolver.query(uri, null, null, null, null); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); } cursor.close();
特点:Google官方推荐,提供编译时校验、流畅API,简化SQLite操作。
数据结构:基于注解定义实体和DAO。
持久化:自动处理事务,支持LiveData
实时更新。
示例代码:
// 定义实体 @Entity public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; } // 定义DAO @Dao public interface UserDao { @Insert void insert(User user); @Query("SELECT FROM User") LiveData<List<User>> getAllUsers(); } // 使用Room数据库 AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app.db").build(); UserDao userDao = db.userDao(); userDao.insert(new User(0, "Bob")); userDao.getAllUsers().observe(lifecycleOwner, users -> { / 更新UI / });
存储类型 | 数据结构 | 适用场景 | 持久化 | 复杂度 |
---|---|---|---|---|
SharedPreferences | 键值对(简单类型) | 轻量级配置、状态保存 | 自动 | 低 |
文件存储 | 自由格式(文本/二进制) | 配置文件、资源文件 | 手动 | 中 |
SQLite | 关系型表格 | 复杂业务数据 | 自动 | 高 |
ContentProvider | URI标识数据 | 跨应用共享(如联系人) | 依赖提供方 | 高 |
Room | 关系型表格(封装) | 复杂数据库+实时更新需求 | 自动 | 中 |
解答:
SharedPreferences
(如夜间模式开关)。 Room
(如用户信息表、订单记录)。 ContentProvider
(如访问系统相册)。 Room
+网络请求(如Firebase)。解答:
| 对比项 | SQLite | Room |
|—————-|—————————-|—————————–|
| API复杂度 | 需手动管理SQLiteOpenHelper
| 提供抽象层,简化CRUD操作 |
| 编译时校验 | 无 | 通过注解生成代码,避免运行时错误 |
| 实时更新 | 需手动实现观察者模式 | 内置LiveData
支持数据变化监听 |
| 最佳用途 | 简单快速原型 | 复杂业务逻辑+长期维护项目 |