数据库类型 | 适用场景 | 特点 |
---|---|---|
SQLite | 轻量级本地存储 | 嵌入式关系型数据库,无需额外配置,适合结构化数据存储 |
Room | 复杂数据管理 | 基于SQLite的ORM框架,提供编译时校验,支持LiveData/Flow响应式编程 |
Realm | 高性能需求 | 面向对象数据库(需引入第三方库),适合频繁读写场景 |
云数据库 | 跨设备同步 | Firebase Firestore等,需网络支持,适合实时同步场景 |
创建数据库帮助类
public class DbHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app.db"; private static final int VERSION = 1; public DbHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建用户表 db.execSQL("CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级逻辑 db.execSQL("ALTER TABLE user ADD COLUMN email TEXT"); } }
CRUD操作示例
// 插入数据 ContentValues values = new ContentValues(); values.put("name", "张三"); values.put("age", 25); getContentResolver().insert(Uri.parse("content://com.example.user"), values);
// 查询数据
Cursor cursor = db.query(“user”, null, “age > ?”, new String[]{“20”}, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex(“name”));
}
cursor.close();
// 更新数据
ContentValues updateValues = new ContentValues();
updateValues.put(“age”, 26);
db.update(“user”, updateValues, “name = ?”, new String[]{“张三”});
// 删除数据
db.delete(“user”, “age < ?”, new String[]{“18”});
三、Room持久库进阶
1. 实体定义
```java
@Entity(tableName = "user")
public class User {
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo(name = "name")
public String name;
@Ignore
public int temp; // 不会被存储的字段
}
DAO接口
@Dao public interface UserDao { @Query("SELECT FROM user WHERE age > :minAge") List<User> getUsersOlderThan(int minAge); @Insert(onConflict = OnConflictStrategy.REPLACE) void insertAll(List<User> users); @Delete void deleteUser(User user); @Update void updateUser(User user); }
数据库构建
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); private static AppDatabase INSTANCE; public static AppDatabase getInstance(Context context) { if(INSTANCE == null){ INSTANCE = Room.databaseBuilder(context, AppDatabase.class, "app.db") .addMigrations(MIGRATION_1_2) // 添加迁移策略 .build(); } return INSTANCE; } static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE user ADD COLUMN email TEXT"); } }; }
迁移方式 | 适用场景 | 注意事项 |
---|---|---|
显式迁移 | 少量结构变更 | 需手动处理数据转换 |
Migration类 | 多版本迭代 | 需保持迁移顺序 |
重建策略 | 重大结构变更 | 会清空所有数据 |
热迁移示例:
// 从版本1升级到版本2 static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { database.execSQL("CREATE TABLE user_temp (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)"); database.execSQL("INSERT INTO user_temp SELECT FROM user"); database.execSQL("DROP TABLE user"); database.execSQL("ALTER TABLE user_temp RENAME TO user"); database.execSQL("ALTER TABLE user ADD COLUMN email TEXT"); } };
Q1:SQLite与Room应该如何选择?
Q2:如何保证数据库操作的线程安全?
allowMainThreadQueries()
允许主线程操作(仅限调试)synchronized
关键字或ContentProvider
封装访问逻辑ExecutorService
或Kotlin协程处理异步