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’s 的 autoGenerate 属性。如果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_name 和 last_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’s 的 autoGenerate 属性。如果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_name 和 last_name 的列值并且这些值被映射到 NameTuple类 的字段中。因此,Room能够生成合适的代码。如果查询返回太多columns,或者一个列不存在,Room将会警告。