安卓开发存储数据对象
- 行业动态
- 2025-04-22
- 3
安卓数据存储方式
安卓开发中存储数据对象的方式多样,根据数据类型、存储需求和生命周期选择合适的方案,以下是常见存储方式及特点:
存储方式 | 数据类型支持 | 持久化 | 适用场景 |
---|---|---|---|
SharedPreferences | 简单键值对(字符串、布尔等) | 是 | 轻量级配置、用户偏好设置 |
文件存储 | 文本、二进制(如图片、视频) | 是(内部存储)/可选(外部存储) | 配置文件、缓存文件、多媒体资源 |
SQLite 数据库 | 结构化数据(表、行、列) | 是 | 复杂业务数据、关系型数据存储 |
ContentProvider | 跨应用数据共享 | 是 | 系统级数据共享(如联系人、媒体库) |
Room 持久库 | 结构化数据(基于 SQLite) | 是 | 复杂数据库操作,结合 LiveData |
SharedPreferences 存储
特点
- 键值对存储:仅支持基本数据类型(
String
、int
、float
、boolean
、long
、Set<String>
)。 - 轻量级:适合存储少量简单配置(如用户登录状态、主题设置)。
- 自动持久化:数据默认保存在应用私有目录,无需手动管理。
实现步骤
// 获取 SharedPreferences 对象 SharedPreferences sp = getSharedPreferences("app_config", MODE_PRIVATE); // 写入数据 SharedPreferences.Editor editor = sp.edit(); editor.putString("username", "admin"); editor.putBoolean("isLoggedIn", true); editor.apply(); // 异步提交 // 读取数据 String username = sp.getString("username", "default_value"); boolean isLoggedIn = sp.getBoolean("isLoggedIn", false);
文件存储
特点
- 支持多种格式:文本文件(
.txt
)、二进制文件(图片、音频、视频)。 - 可自定义路径:分为内部存储(自动清理)和外部存储(需申请权限)。
- 权限管理:外部存储需动态申请
READ_EXTERNAL_STORAGE
和WRITE_EXTERNAL_STORAGE
。
实现步骤
// 内部存储(无需权限) File file = new File(getFilesDir(), "config.txt"); try (FileOutputStream fos = new FileOutputStream(file)) { fos.write("key=value".getBytes()); } // 外部存储(Android 10+ 推荐使用 Scopeted Storage) File externalFile = new File(getExternalFilesDir("documents"), "data.bin"); try (FileInputStream fis = new FileInputStream(externalFile)) { // 读取文件内容 }
SQLite 数据库
特点
- 结构化存储:支持表、索引、事务,适合复杂业务逻辑。
- 手动管理:需创建数据库、表结构,编写 SQL 语句。
- 性能优势:适合大量数据存储和查询。
实现步骤
// 创建数据库助手类 public class DBHelper extends SQLiteOpenHelper { public DBHelper(Context context) { super(context, "app_database.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS users"); onCreate(db); } } // 增删改查操作 SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("INSERT INTO users (name) VALUES (?)", new String[]{"Alice"}); Cursor cursor = db.rawQuery("SELECT FROM users", null);
Room 持久库(基于 SQLite)
特点
- 抽象层:通过注解生成代码,减少手写 SQL。
- 编译时检查:避免运行时错误。
- 集成 LiveData:支持观察数据变化。
实现步骤
// 定义实体类 @Entity(tableName = "users") 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 users") LiveData<List<User>> getAllUsers(); } // 创建数据库 @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); } // 使用 AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app_db").build(); UserDao dao = db.userDao(); dao.insert(new User()); dao.getAllUsers().observe(lifecycleOwner, users -> { / 更新 UI / });
常见问题与解答
问题1:如何选择存储方式?
- 轻量级配置:使用
SharedPreferences
。 - 文件资源:优先内部存储,若需共享则用外部存储。
- 复杂数据:使用
SQLite
或Room
。 - 跨应用共享:通过
ContentProvider
。
问题2:Room 相比直接使用 SQLite 有什么优势?
- 代码简洁:通过注解自动生成 CRUD 代码,减少模板代码。
- 类型安全:编译时检查 SQL 语句和字段匹配。
- 实时响应:集成
LiveData
,数据变更自动通知 UI。 - 迁移支持:提供数据库版本迁移