Android——Room

Room

Room为SQLite提供一个抽象层,在充分利用SQLite的同时,允许流的数据库访问

Room的三个主要组件

  • Database:你可以使用这个组件创建一个数据库 holder 。注解定义了一系列 entities 并且类的内容提供了一系列 DAOs 。注解的类应该是一个抽象的继承 RoomDatabase 的类。在运行时,你能通过调用 Room.databaseBuilder() 或者 Room.inMemoryDatabaseBuilder() 获得一个实例。

  • Entity:这个组件代表一个持有数据行的类。对于每个 entity ,一个数据库表被创建用于持有 items 。必须通过 Database类 中的 entities数组 。每个 entity字段 被持久化到数据库中除非你注解它通过 @Ignore

注意:Entities能够有一个空的构造函数(如果dao类能够访问每个持久化的字段)或者一个参数带有匹配entity中的字段的类型和名称的构造函数,例如一个只接收其中一些字段的构造函数

  • DAO:这个组件代表了一个类或者接口作为DAO。DAOs 是Room中的主要组件,负责定义访问数据库的方法。被注解为 @Database 的类必须包含一个没有参数的抽象方法并且返回注解为 @Dao 的类。当在编译时生成代码,Room创建一个这个类的实现。

注意:使用DAO类访问数据库,而不是query builders或者直接查询。你可以把数据库分成几个组件。还有,DAOs允许你轻松的模拟数据库访问,当你想要测试你的应用的时候。

Primary Key(主键)

每个entity必须定义至少一个字段作为主键。即使这里只有一个字段,仍然需要使用 @PrimaryKey 注解这个字段。如果你想动态给entities分配ID,你可以设置 @PrimaryKey’sautoGenerate 属性。如果entity有个组合的主键,你可以使用 @Entity 注解的 primaryKeys 的属性。如:

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

默认情况下,Room使用类名作为数据库的表名。如果你想设置表名,通过设置 @Entity 注解的 tableName 属性。如:

@Entity(tableName = "users")
class user {
    ...
}

注意:SQLite的表明是大小写敏感的。

Returning subsets of columns(返回列中的子集)

多数时候,你仅仅需要获取一个entity中的部分字段。例如,你的UI可能只展示user的第一个和最后一个名称,而不是关于所有的细节。这样查询更快,Room允许你返回任何java对象从查询中只要列结果集能够被映射到返回的对象中。如:

创建如下对象获取用户的姓和名

public class NameTuple {
    @ColumnInfo(name = "first_name")
    public String firstName;
    
    @ColumnInfo(name = "last_name")
    public String lastName;
}

现在,你可以使用这个对象在你的查询方法中

@Dao
public interface MyDao {
    @Query("SELECT first_name, last_name FROM user")
    public List<NameTuple> getName();
}

Room理解查询返回 first_namelast_name 的列值并且这些值被映射到 NameTuple类 的字段中。因此,Room能够生成合适的代码。如果查询返回太多columns,或者一个列不存在,Room将会警告。

—### Room

Room为SQLite提供一个抽象层,在充分利用SQLite的同时,允许流的数据库访问

Room的三个主要组件

  • Database:你可以使用这个组件创建一个数据库 holder 。注解定义了一系列 entities 并且类的内容提供了一系列 DAOs 。注解的类应该是一个抽象的继承 RoomDatabase 的类。在运行时,你能通过调用 Room.databaseBuilder() 或者 Room.inMemoryDatabaseBuilder() 获得一个实例。

  • Entity:这个组件代表一个持有数据行的类。对于每个 entity ,一个数据库表被创建用于持有 items 。必须通过 Database类 中的 entities数组 。每个 entity字段 被持久化到数据库中除非你注解它通过 @Ignore

注意:Entities能够有一个空的构造函数(如果dao类能够访问每个持久化的字段)或者一个参数带有匹配entity中的字段的类型和名称的构造函数,例如一个只接收其中一些字段的构造函数

  • DAO:这个组件代表了一个类或者接口作为DAO。DAOs 是Room中的主要组件,负责定义访问数据库的方法。被注解为 @Database 的类必须包含一个没有参数的抽象方法并且返回注解为 @Dao 的类。当在编译时生成代码,Room创建一个这个类的实现。

注意:使用DAO类访问数据库,而不是query builders或者直接查询。你可以把数据库分成几个组件。还有,DAOs允许你轻松的模拟数据库访问,当你想要测试你的应用的时候。

Primary Key(主键)

每个entity必须定义至少一个字段作为主键。即使这里只有一个字段,仍然需要使用 @PrimaryKey 注解这个字段。如果你想动态给entities分配ID,你可以设置 @PrimaryKey’sautoGenerate 属性。如果entity有个组合的主键,你可以使用 @Entity 注解的 primaryKeys 的属性。如:

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

默认情况下,Room使用类名作为数据库的表名。如果你想设置表名,通过设置 @Entity 注解的 tableName 属性。如:

@Entity(tableName = "users")
class user {
    ...
}

注意:SQLite的表明是大小写敏感的。

Returning subsets of columns(返回列中的子集)

多数时候,你仅仅需要获取一个entity中的部分字段。例如,你的UI可能只展示user的第一个和最后一个名称,而不是关于所有的细节。这样查询更快,Room允许你返回任何java对象从查询中只要列结果集能够被映射到返回的对象中。如:

创建如下对象获取用户的姓和名

public class NameTuple {
    @ColumnInfo(name = "first_name")
    public String firstName;
    
    @ColumnInfo(name = "last_name")
    public String lastName;
}

现在,你可以使用这个对象在你的查询方法中

@Dao
public interface MyDao {
    @Query("SELECT first_name, last_name FROM user")
    public List<NameTuple> getName();
}

Room理解查询返回 first_namelast_name 的列值并且这些值被映射到 NameTuple类 的字段中。因此,Room能够生成合适的代码。如果查询返回太多columns,或者一个列不存在,Room将会警告。


猜你喜欢

转载自blog.csdn.net/weixin_42164949/article/details/83894864