2023年7月25日发(作者:)
Jetpack之RoomDatabase简介及其使⽤简介Room是SQLite之上的⼀个抽象层,通过Room,可以更加丝滑的使⽤SQLite的全部功能。并且,原本在运⾏期才能发现的SQL语句错误,现在在编译期就会报错,写过SQL的同学都懂,尤其是使⽤复杂语句的时候,这使得SQL语句纠错的时间⼤⼤缩短。Room主要由以下三个部分组成:DataBase ⽤ seBuilder() 或 ryDatabaseBuilder().⽅法获取DataBase实例Entity 可以看成是数据库中的表DAO 提供访问数据库的⽅法关系图1. Database1.1 定义数据库// entities是数据,有⼏个元素就建⽴⼏张表@Database(entities = {}, version = 1)public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao();}1.2 获取数据库AppDatabase db = seBuilder(getApplicationContext(), , "database-name").build();2. EntityEntity 默认为每个属性定义⼀列,可以使⽤@Ignore注解来忽略;属性必须为public或提供公有的getters和setters。以User为例:@Entitypublic class User { @PrimaryKey private int uid; @ColumnInfo(name = "first_name") private String firstName; @ColumnInfo(name = "last_name") private String lastName;
// 默认为每个属性定义⼀列,可以使⽤@Ignore注解来避免创建此列 @Ignore Bitmap picture; // 属性必须为public或提供公有的getters and setters,为了简洁,在此省略}2.1 主键:使⽤@PrimaryKey来定义主键,如果需要⼀个⾃增的主键,@PrimaryKey的autoGenerate置为true:@PrimaryKey(autoGenerate = true)
private int index;2.2 复合主键:@Entity(primaryKeys = {"firstName", "lastName"})public class User { public String firstName; public String lastName; @Ignore Bitmap picture;}2.3 表名:默认使⽤类名作为表名,也可以指定表名@Entity(tableName = "users")public class User { ……}2.4 列明默认使⽤属性名作为列名,可以⽤@ColumnInfo注解去重新指定@Entity(tableName = "users")public class User { @PrimaryKey public int id; @ColumnInfo(name = "first_name") public String firstName; @ColumnInfo(name = "last_name")
public String lastName; @Ignore Bitmap picture;}2.5 使⽤索引@Entity(indices = {@Index("name"), @Index(value = {"last_name", "address"})})public class User { @PrimaryKey public int id; public String firstName; public String address; @ColumnInfo(name = "last_name") public String lastName; @Ignore Bitmap picture;}@Entity(indices = {@Index(value = {"first_name", "last_name"}, unique = true)})public class User { @PrimaryKey public int id; @ColumnInfo(name = "first_name") public String firstName; @ColumnInfo(name = "last_name") public String lastName; @Ignore Bitmap picture;}2.6 外键@Entity(foreignKeys = @ForeignKey(entity = , parentColumns = "id", childColumns = "user_id"))public class Book { @PrimaryKey public int bookId; public String title; @ColumnInfo(name = "user_id") public int userId;}2.7 混合型Entity例如有Address类,有三个属性:street、state、city,User表中⼜包含这个三个列,可以使⽤@Embedded注解public class Address { public String street; public String state; public String city; @ColumnInfo(name = "post_code") public int postCode;}@Entitypublic class User { @PrimaryKey public int id; public String firstName; @Embedded public Address address;}2.8 复杂类型的使⽤属性类型不局限于SQLite数据类型,可以使⽤使⽤任意类型,但在使⽤⾮SQLite数据类型时,需要定义Converter类,⽤于将数据转化为数据可以存储的类型1. 定义Convert类public class Converter1 { @TypeConverter public static Date fromTimestamp(Long value) { return value == null ? null : new Date(value); } @TypeConverter public static Long dateToTimestamp(Date date) { return date == null ? null : e(); }}2. 给Database加注解:@Database(entities = {}, version = 1)@TypeConverters({, })public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao();}3 o可以是interface也可以是abstract类,如果是abstract类,需要提供⼀个参数为RoomDatabase的构造函数。Room会在编译器⾃动我们⽣成DAO的实现类定义增删改查⽅法:3.1 增使⽤@Insert注解,通常Room会使⽤⼀次事务把所有数据都插⼊数据库中。@Daopublic interface MyDao { @Insert(onConflict = E) public void users); @Insert public void insertBothUsers(User user1, User user2); @Insert public void insertUsersAndFriends(User user, List> loadUsersFromRegionsSync(List
> loadUserAndPetNames(); // You can also define this class in a separate file, as long as you add the // "public" access modifier. static class UserPet { public String userName; public String petName; }}@Daopublic interface MyDao { @Query("SELECT first_name, last_name FROM user") public List
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690217856a316609.html
评论列表(0条)