Android Room 数据库使用详解

一、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 {

    //插入采集信息
    @Insert
    void insert(StudentDao studentDao);

    //删除
    @Delete
    void delete(StudentDao studentDao);

    //更新
    @Update
    void 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) {
        @Override
        public 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表中的数据迁移到新表students
            database.execSQL("insert into students(id, name, age) select id, name, age from student");
            //删除旧表student
            database.execSQL("drop table student");
            //将新表students名称修改为student
            database.execSQL("alter table students rename to student");
        }
    };  

}

升级数据库:https://blog.51cto.com/u_14152/9288966

相关推荐
Digitally17 分钟前
如何从 Android 设备打印短信(5 种方法)
android
代码配咖啡25 分钟前
《Navicat之外的新选择:实测支持国产数据库的SQLynx核心功能解析》
数据库
casual_clover25 分钟前
Android 中 打开文件选择器(ACTION_OPEN_DOCUMENT )
android
懒大王爱吃狼1 小时前
怎么使用python进行PostgreSQL 数据库连接?
数据库·python·postgresql
时序数据说1 小时前
IoTDB集群的一键启停功能详解
大数据·数据库·开源·时序数据库·iotdb
小叶子来了啊1 小时前
信息系统运行管理员:临阵磨枪版
运维·服务器·数据库
数据库幼崽2 小时前
MySQL 8.0 OCP 1Z0-908 131-140题
数据库·mysql·ocp
_龙小鱼_2 小时前
卡顿检测与 Choreographer 原理
android·kotlin
北漂老男孩2 小时前
主流数据库运维故障排查卡片式速查表与视觉图谱
运维·数据库
源码云商2 小时前
基于SpringBoot的校园周边美食探索及分享平台【附源码+数据库+文档下载】
数据库·spring boot·美食