存储方式 | 适用场景 | 特点 |
---|---|---|
SQLite | 结构化数据存储(如用户信息、订单记录等) | 轻量级关系型数据库,支持SQL语法,需手动管理数据库连接与操作 |
Room | 需要类型安全的数据库访问,追求开发效率与可维护性 | 基于SQLite的抽象层,提供编译时校验,支持LiveData与RxJava |
文件存储 | 非结构化数据(如图片、音频、配置文件等) | 简单键值对存储,适合少量配置数据,SharedPreferences本质是XML文件存储 |
MMKV | 高频读写的小型配置数据 | 腾讯开源的key-value存储方案,性能优于SharedPreferences |
// 在app/build.gradle中添加 dependencies { def room_version = "2.5.1" implementation "androidx.room:room-runtime:$room_version" kapt "androidx.room:room-compiler:$room_version" // 如果使用Kotlin }
// 使用@Entity注解标记表结构 @Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "username") public String username; @ColumnInfo(name = "password") public String password; }
// 定义数据访问对象,包含增删改查方法 @Dao public interface UserDao { @Insert void insertUser(User user); @Update void updateUser(User user); @Delete void deleteUser(User user); @Query("SELECT FROM user WHERE id = :userId") User getUserById(int userId); }
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
AppDatabase db = Room.databaseBuilder( getApplicationContext(), AppDatabase.class, "app-database" ).build();
public class DBHelper extends SQLiteOpenHelper { private static final String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS user (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "username TEXT," + "password TEXT)"; public DBHelper(Context context) { super(context, "user.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS user"); onCreate(db); } }
// 插入数据 SQLiteDatabase db = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("username", "admin"); values.put("password", "123456"); db.insert("user", null, values);
当数据库版本升级时:
Room.databaseBuilder(context, AppDatabase.class, "app-database") .addMigrations(new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { // 添加新字段 database.execSQL("ALTER TABLE user ADD COLUMN age INTEGER"); } }).build();
场景 | 推荐方案 | 原因 |
---|---|---|
复杂业务数据存储 | Room + LiveData | 类型安全、实时监听数据变化 |
简单配置存储 | MMKV | 高性能、支持多进程共享 |
大数据量文件存储 | Room + 文件系统 | 结构化元数据存储在数据库,二进制文件单独存储 |
敏感数据保护 | SQLCipher + Room | 数据库全盘加密,防止数据泄露 |
Q1:Room相比直接使用SQLite的优势是什么?
A1:Room提供以下核心优势:
Q2:如何处理多线程并发访问数据库的问题?
A2:解决方案包括:
RoomDatabase.setQueryExecutionCallback()
配置 AsyncTask
或ExecutorService
处理写入操作 @Transaction
注解保证原子性操作 LiveData
在后台线程执行数据库操作,UI线程观察结果