Room Database数据库使用以及数据库版本升级详解

本文详细介绍了Android Room数据库的使用,包括Entity、DAO和RoomDatabase的创建及作用,阐述了如何进行数据库版本升级,包括简单变化和复杂变化的迁移策略,以及多版本迁移的处理方法。
摘要由CSDN通过智能技术生成

Android数据持久层直接使用SQLite很麻烦,Google官方推出了Room, Google对Room的定义: The Room persistence library provides an abstraction layer over SQLite to allow fluent database access while harnessing the full power of SQLite. Room是SQLite之上的一个抽象层,通过Room层来摆脱,繁琐的 数据库 操作,包括创建、更新数据库、表以及进行增删查改等。

Room数据库结构

Room数据库包含三个对象:

1、Entity: 对应数据库中的表,可以使用Entity注解将一个类变成数据库中的一张表结构
2、DAO: 全称Database Access Object,定义了对数据库中数据的读写等操作,DAO中可以使用SQL语句来操作数据库
3、RoomDatabase: 数据库持有类,用于创建数据库或者连接到数据库。内部包含DAO和Entity

上面总体说了Room数据库的三个对象,下面分别介绍三个对象的作用和使用方法。

Entity

Room Database中的Entity表示一张数据表结构,一个Entity实例就是表中的一行,如定义一个Person类的Entity。

@Entity
public class Person{
   
    @PrimaryKey
    public int id;
    public String firstName;
    public String lastName;
}

当有两个Person对象在表中时,表中的数据如下:
在这里插入图片描述
重点:

1、一个Entity对象代表数据表中的一行,一个Entity类代表一张数据表
2、Entity中的成员变量都是数据表中的列
3、一个 Java 类定义成Entity只要加上Entity注解就可以了

Entity的使用

1、定义一个Entity

@Entity(tableName = "person_table")
public class Person{
   
    @PrimaryKey
    public int id;

    public String firstName;
    public String lastName;
}

如果想给Entity命名可以在@Entity注解的后面加上 (tableName = “person_table”) ,如果不加会使用默认命名,上面的id,firstName, lastName都定义成了public类型,是为了数据库能够有操作这些数据的权限,也可以选择将这些都设置成private类型,然后通过setter和getter来操作。

2、定义主键

每一个Entity至少定义一个主键(primary key),哪怕Entity中只有一个变量也要将这个变量定义为主键,在Room数据库中使用注解 @PrimaryKey 来定义主键,@PrimaryKey 的使用方式有两种一种是在类变量前面加,如果主键比较复杂可以加在@Entity注解的后面。

@Entity(primaryKeys = {
   "firstName", "lastName"})
public class User {
   
    public String firstName;
    public String lastName;
}

3、改变属性列名

和改变表名称tableName一样,可以改变表中的列名称,使用 @ColumnInfo来改变列的名称。如果不改的话默认使用变量名的小写形式。

@Entity(tableName = "person_table")
public class Person {
   
    @PrimaryKey
    public int id;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;
}

4、使某些变量不生成数据表中的字段

由上面可知当一个类前加了Entity注解后类中的所有成员变量都会生成表中的属性列,如果我们不希望某个变量生成表中的属性列,可以使用注解 @Ignore。

@Entity
public class Person {
   
    @PrimaryKey
    public int id;
    public String firstName;
    public String lastName;

    @Ignore
    Bitmap picture;
}

如果有类继承上面的Person类,并且不想picture生成数据表中的列,那么可以ignoredColumns

@Entity(ignoredColumns = "picture")
public class RemotePerson extends Person {
   
    @PrimaryKey
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值