组件 | 说明 |
---|---|
SQLiteDatabase | 代表数据库对象,支持增删改查操作 |
SQLiteOpenHelper | 辅助创建/更新数据库结构,管理版本控制 |
ContentValues | 用于存储键值对数据,类似Map结构 |
Cursor | 结果集游标,遍历查询结果 |
创建数据库步骤:
SQLiteOpenHelper
实现数据库创建逻辑onCreate()
方法创建表结构onUpgrade()
处理数据库升级getWritableDatabase()
获取可写数据库实例public class MyDBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app.db"; private static final int VERSION = 1; public MyDBHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建用户表 String sql = "CREATE TABLE user(id INTEGER PRIMARY KEY,name TEXT,age INTEGER)"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级处理(如表结构变更) } }
核心组件:
@Entity
:标注数据库表结构@Dao
:定义数据访问接口@Database
:配置数据库信息示例代码:
// 1. 定义实体类 @Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "name") public String name; public int age; } // 2. 定义DAO接口 @Dao public interface UserDao { @Insert void insertUser(User... users); @Query("SELECT FROM user WHERE id = :userId") User getUserById(int userId); } // 3. 配置数据库 @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
特性 | SQLite原始API | Room持久库 |
---|---|---|
编译时检查 | 无 | 支持(通过注解处理器) |
线程安全 | 需手动处理 | 自动支持(LiveData/RxJava) |
代码生成 | 无 | 自动生成DAO实现 |
迁移支持 | 需手动实现 | 提供Migration API |
空数据处理 | 需判断Cursor是否为空 | 返回Optional类型 |
当VERSION
版本号更新时:
Migration
对象addMigrations()
中注册迁移脚本Room.migrationsExecutor(AppDatabase.class, new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { // 添加新字段 database.execSQL("ALTER TABLE user ADD COLUMN email TEXT"); } }).build();
Q1:为什么推荐使用Room而不是直接操作SQLite?
A:Room提供以下优势:
Q2:如何处理数据库版本升级导致的表结构变更?
A:解决方案:
VERSION
版本号Migration
接口定义变更逻辑databaseBuilder().addMigrations()
注册迁移脚本fallbackToDestructiveMigration()
重置