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

相关推荐
initialize1306几秒前
Postgresql(Oracle兼容) 到Oracle19.9字符语义
数据库·oracle
稷下元歌26 分钟前
七天学会plc 加机器视觉完整笔记:S7-1200 数据类型、存储区与寻址方式(I/Q/M/DB 详解)。
网络·数据库·笔记
潮起鲸落入海33 分钟前
mysql 5.x源码安装
数据库·mysql
睡不醒男孩0308231 小时前
第一篇:多云与多模态时代的企业级数据库云管理平台(DBaaS)选型指南
数据库·clup·中启乘数
小二·1 小时前
向量数据库实战
数据库
炘爚1 小时前
Phase 5:MySQL 连接池
数据库·mysql
j_xxx404_2 小时前
MySQL库操作硬核解析:字符集、校验规则、大小写比较、备份恢复与连接排查
运维·服务器·数据库·人工智能·mysql·ai·oracle
minji...2 小时前
MySQL数据库 (五) MySQL表的约束(上),非空约束,默认值约束,零填充约束,主键约束,符合主键
数据库·mysql·表的约束·主键约束·非空约束·复合主键·零填充约束
拾贰_C3 小时前
【python | installation 】python 安装 | Windows | 命令使用
linux·数据库·ubuntu
贺今宵3 小时前
Vue 3 + Capacitor 使用jeep-sqlite,web端使用本地sqlite数据库
前端·数据库·vue.js·sqlite·web