一、Room介绍
Android Room 是 Google 提供的一个 Android 数据持久化库,是 Android Jetpack 组成部分之一。它提供了一个抽象层,使得 SQLite 数据库的使用更为便捷。通过 Room,开发者可以轻松地操作数据库,不需要直接编写繁琐的 SQL 语句。
Room官方使用示例:https://developer.android.google.cn/codelabs/android-room-with-a-view-kotlin?hl=zh-cn#0
Room 包含三个主要组件:
- 数据库类,用于保存数据库并作为应用持久性数据底层连接的主要访问点。
- 数据实体类,用于表示应用的数据库中的表。
- 数据访问对象 (DAO),为您的应用提供在数据库中查询、更新、插入和删除数据的方法。
数据库类为应用提供与该数据库关联的 DAO 的实例。反过来,应用可以使用 DAO 从数据库中检索数据,作为关联的数据实体对象的实例。此外,应用还可以使用定义的数据实体更新相应表中的行,或者创建新行供插入。图 1 说明了 Room 的不同组件之间的关系。
二、引入Room库
在build.gradle中引入Room库:
//Room数据库def room_version = "2.5.1"implementation "androidx.room:room-runtime:$room_version"annotationProcessor "androidx.room:room-compiler:$room_version"
三、创建实体类
//实体类 表名 不写默认类名首字母小写
@Entity(tableName = "student")
public class StudentEntity {//主键 自动生成@PrimaryKey(autoGenerate = true)private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
四、创建数据访问对象 (DAO)
@Dao
public interface StudentDao {//插入采集信息@Insertvoid insert(StudentDao studentDao);//删除@Deletevoid delete(StudentDao studentDao);//更新@Updatevoid update(StudentDao studentDao);//查询 名称查询 @Query("select * from student where name =:studentName LIMIT 1")CollectEntity getCollectEntityByFileName(String studentName);//查询 根据age倒序@Query("select * from student order by age desc")List<CollectEntity> getAllCollectList();/*** 查询 根据age倒序,分页查询** @param pageSize 每页的数据量* @param offset 偏移量*/@Query("select * from student order by age desc LIMIT :pageSize OFFSET :offset")List<CollectEntity> getPageCollectList(int pageSize, int offset);
}
五、创建数据库类
@Database(entities = {StudentEntity.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {public static volatile AppDatabase instance;public abstract StudentDao studentDao();public static AppDatabase getInstance() {if (instance == null) {synchronized (AppDatabase.class) {if (instance == null) {instance = Room.databaseBuilder(Utils.getApp().getApplicationContext(),AppDatabase.class, testDb)//是否允许在主线程上操作数据库,默认false。.allowMainThreadQueries().build();}}}return instance;}
}
六、使用数据库
StudentDao studentDao = AppDatabase.getInstance().studentDao();studentDao.insert(studentEntity);
七、更新数据库
将age的属性由int 更改为 String,version 版本号加1
@Database(entities = {StudentEntity.class}, version = 2)
public abstract class AppDatabase extends RoomDatabase {public static volatile AppDatabase instance;public abstract StudentDao studentDao();public static AppDatabase getInstance() {if (instance == null) {synchronized (AppDatabase.class) {if (instance == null) {instance = Room.databaseBuilder(Utils.getApp().getApplicationContext(),AppDatabase.class, QZConstants.DB.DB_NAME)//是否允许在主线程上操作数据库,默认false。.allowMainThreadQueries().addMigrations(MIGRATION_1_2).build();}}}return instance;}private static final Migration MIGRATION_1_2 = new Migration(1, 2) {@Overridepublic void migrate(@NonNull SupportSQLiteDatabase database) {//创建一个新表,表名为students,age属性为String database.execSQL("CREATE TABLE IF NOT EXISTS students(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT, age TEXT)");//将旧表student表中的数据迁移到新表studentsdatabase.execSQL("insert into students(id, name, age) select id, name, age from student");//删除旧表studentdatabase.execSQL("drop table student");//将新表students名称修改为studentdatabase.execSQL("alter table students rename to student");}}; }
升级数据库:https://blog.51cto.com/u_14152/9288966