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

相关推荐
wei_shuo6 分钟前
KES 扩展与插件开发实战:自定义函数、触发器与第三方插件集成
数据库·kes
风中芦苇啊1 小时前
从直接生成到受控配置:新一代图表Agent的SQL安全生成范式
数据库·sql·安全
帅次1 小时前
Android 高级工程师面试:Java 基础知识 近1年高频追问 22 题
android·java·面试
吴声子夜歌1 小时前
SQL进阶——窗口函数
数据库·sql
周杰伦的稻香1 小时前
MySQL8.0+中引入的SET_USER_ID权限迭代SUPER权限指定 DEFINER
数据库·mysql
动恰客流统计1 小时前
客流统计如何结合AI分析?从传统计数到智能决策的技术升级路径
数据库·人工智能·边缘计算
私人珍藏库2 小时前
[Android] zip解压缩管理-全格式压缩包一键解压+打包
android·app·生活·工具·多功能
宠友信息2 小时前
多端数据互通场景下Spring Boot仿小红书源码结构设计
数据库·spring boot·redis·缓存·架构
风曦Kisaki2 小时前
#Linux数据库管理Day06:主从同步与MaxScale读写分离
linux·运维·数据库
影寂ldy2 小时前
C# try-catch 异常处理全套笔记
服务器·数据库·c#