Room数据库使用

本文介绍了如何使用Android的Room数据库,包括添加依赖、定义Entity实体类、创建Dao接口、初始化数据库、正确使用数据库以及进行数据库迁移的方法。在数据库迁移部分,详细阐述了如何在实体类中添加新字段并创建Migration对象来更新数据库结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.添加依赖:
implementation 'android.arch.persistence.room:runtime:1.0.0'
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'
2.创建Entity实体类:

每个Entity实体对象都会映射为表中的某一行

@Entity(tableName = "student")						//使用Entity注解定义表名为student
public class Student{
 
 	 @PrimaryKey(autoGenerate = true)				//设置主键,并且定义自增增
 	 @ColumnInfo(name = "uid")						
 	 private int uid;

 	 @ColumnInfo(name = "name")						//这里变量名和字段名不同,注解不可省略
 	 private String studentName;
 	
 	 private String age;							//变量名和字段名都是age,可以省略不写
 	
 	 public User() {								//必须指定一个构造方法,room框架需要。并且只能指定一个
 	 }
 	
	 @Ignore										//其他构造方法要添加@Ignore注解
 	 public User(int uid) {
    	 this.uid = uid;
 	 }
	
 	 public int getUid() {							//三个字段的Setter、Getter方法必须添加,这里省略
    	 return uid;
 	 }

	 public void setUid(int uid) {
	     this.uid = uid;
	 }
	 ...
}
3.创建Dao接口:
@Dao
public interface StudentDao {
    @Query("SELECT * FROM user")
    List<Student> getAllStudent();

    @Insert
    void insert(Student... users);

    @Update
    void update(Student... users);

    @Delete
    void delete(Student... users);
}

Insert, Update, Delete可以传入多种不同的参数。例如:

@Insert
void insert(Student... students);

@Insert
void insert(Student student);

@Insert
void insert(List<Student> studentLists);

Query也可以返回多种不同的类型。

@Query("SELECT * FROM student")
List<Student> getAllStudent();

@Query("SELECT * FROM student WHERE id=:id")
User getStudent(int id);

@Query("SELECT * FROM student")
Cursor getStudentCursor();

@Query("SELECT * FROM user WHERE age=:age")
List<User> getStudentByAge(int age);
4.创建数据库:
@Database(entities = { Student.class }, version = 1,exportSchema = false)
public abstract class StudentDatabase extends RoomDatabase {

    private static final String DB_NAME = "StudentDatabase.db";
    private static volatile StudentDatabase instance;

    static synchronized StudentDatabase getInstance(Context context) {
        if (instance == null) {
            instance = create(context);
        }
        return instance;
    }

    private static StudentDatabase create(final Context context) {
        return Room.databaseBuilder(
            context,
            StudentDatabase.class,
            DB_NAME).build();
    }

    public abstract UserDao getUserDao();
}
5.使用数据库:

必须在后台线程中使用数据库,否则会报错

Student student = new Student();
student.setName("Tom");
student.setAge(18);
UserDatabase
        .getInstance(context)
        .getUserDao()
        .insert(student);
        
List<User> allUsers = UserDatabase
        .getInstance(context)
        .getUserDao()
        .getAllStudents();
6.数据库迁移:

1.在Student实体类中新增一个字段:

 	private int grade;

2.在Student实体类中新增一个字段:

@Database(entities = { Student.class }, version = 2, exportSchema = false)
public abstract class StudentDatabase extends RoomDatabase {
	//...
    public abstract UserDao getUserDao();
}

3.创建一个Migration对象,在数据库中新增grade列

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE department ADD COLUMN grade INTEGER");
    }
};

4.在数据库对象创建时候添加该Migration对象

 AppDatabase db = Room.databaseBuilder(getApplicationContext(),
            AppDatabase.class, "roomDemo-database")
            .addMigrations(AppDatabase.MIGRATION_1_2)
            .build();
<think>我们正在回答用户关于AndroidRoom数据库使用步骤的问题。用户要求了解基本使用步骤和配置方法。根据之前的对话历史,用户已经了解了一些Android框架的知识,现在专注于Room数据库。我们将按照以下步骤进行说明:1.添加依赖2.创建实体类(Entity)3.创建数据访问对象(DAO)4.创建数据库类(Database)5.使用数据库同时,我们可以参考引用[3]中提到的分页库与Room的集成,但用户问题主要集中在Room本身的使用步骤。注意:回答中需要引用相关引用内容时,在末尾添加引用标识,如[^3]。但注意,我们的引用[3]是关于分页库的,与Room直接相关的内容可能不多,但可以提及Room支持分页库(如返回PagingSource)。另外,用户提供的引用[1]和[2]与数据库恢复和后台任务相关,但用户问题并不直接涉及这些,因此可能不直接引用。引用[4]是性能对比表,与Room使用步骤无关。因此,我们主要根据Room的官方文档和使用方法进行回答。步骤详解:1.添加依赖:在build.gradle文件中添加Room的依赖。2.创建实体类:使用@Entity注解定义数据表的结构。3.创建DAO:使用@Dao注解定义访问数据库的方法(查询、插入、更新、删除等)。4.创建数据库类:使用@Database注解定义数据库的持有者,并包含实体列表和数据库版本。5.使用数据库:通过Room数据库实例获取DAO,然后进行数据库操作。同时,我们可以提到一些最佳实践,如使用协程进行异步操作(避免在主线程操作数据库)等。最后,生成相关问题。注意:使用中文回答,并按照要求使用LaTeX格式(如果有数学表达式,但Room使用中一般没有,所以可能不需要)。开始回答:</think>### Android Room 数据库使用步骤详解 #### 一、添加依赖(Gradle配置) ```gradle dependencies { def room_version = "2.6.1" // 核心库 implementation "androidx.room:room-runtime:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version" // Kotlin扩展(可选) implementation "androidx.room:room-ktx:$room_version" // 测试支持 testImplementation "androidx.room:room-testing:$room_version" } ``` #### 二、创建数据实体(Entity) ```kotlin @Entity(tableName = "users") data class User( @PrimaryKey(autoGenerate = true) val id: Int = 0, @ColumnInfo(name = "user_name") val name: String, @ColumnInfo(index = true) val email: String, // 创建索引 val age: Int ) ``` - **`@Entity`**:标记数据表 - **`@PrimaryKey`**:定义主键(`autoGenerate` 表示自增) - **`@ColumnInfo`**:自定义列名/索引[^3] #### 三、创建DAO接口 ```kotlin @Dao interface UserDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insert(user: User) @Update suspend fun update(user: User) @Query("SELECT * FROM users") fun getAll(): Flow<List<User>> // 返回Flow实现实时更新 @Query("SELECT * FROM users WHERE age > :minAge") suspend fun getUsersByAge(minAge: Int): List<User> @Delete suspend fun delete(user: User) } ``` - **CRUD操作**:`@Insert`, `@Update`, `@Query`, `@Delete` - **异步支持**:`suspend` 协程或返回 `Flow`[^2] #### 四、创建数据库类 ```kotlin @Database( entities = [User::class], version = 1, exportSchema = true // 记录架构变更历史 ) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao companion object { @Volatile private var INSTANCE: AppDatabase? = null fun getDatabase(context: Context): AppDatabase { return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext, AppDatabase::class.java, "app_database" // 数据库文件名 ).build() INSTANCE = instance instance } } } } ``` - **单例模式**:确保全局唯一实例 - **`exportSchema`**:启用架构导出(用于迁移) #### 五、使用数据库(在Activity/Fragment中) ```kotlin // 初始化 val db = AppDatabase.getDatabase(applicationContext) val userDao = db.userDao() // 插入数据 lifecycleScope.launch { userDao.insert(User(name = "Alice", email = "alice@example.com", age = 28)) } // 观察数据变化 lifecycleScope.launch { userDao.getAll().collect { users -> // 更新RecyclerView等UI } } ``` #### 六、数据库迁移(Schema变更) ```kotlin // 步骤1:更新实体类(例如新增列) @Entity(tableName = "users") data class User( ... // 原有字段 val registrationDate: String // 新增字段 ) // 步骤2:提升数据库版本 @Database(entities = [User::class], version = 2) // 从1改为2 // 步骤3:定义Migration val MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("ALTER TABLE users ADD COLUMN registrationDate TEXT") } } // 步骤4:应用迁移 Room.databaseBuilder(...) .addMigrations(MIGRATION_1_2) .build() ``` - **最佳实践**:始终保留旧版本Schema文件(`exportSchema=true`)[^1] #### 七、性能优化技巧 1. **主线程规避**: ```kotlin .allowMainThreadQueries() // 避免使用!仅在调试时允许 ``` 2. **预填充数据**: ```kotlin .createFromAsset("database/prepopulated.db") ``` 3. **索引优化**:对频繁查询的列添加 `@ColumnInfo(index = true)` 4. **分页支持**:与Paging库集成实现分批加载[^3] --- ### 关键配置选项 | 配置项 | 说明 | 示例 | |--------|------|------| | **`fallbackToDestructiveMigration`** | 无迁移策略时删除重建 | `.fallbackToDestructiveMigration()` | | **`addCallback`** | 数据库创建/打开回调 | `.addCallback(object : Callback() {...})` | | **`setJournalMode`** | 事务日志模式 | `.setJournalMode(JournalMode.TRUNCATE)` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值