Google Android Room 一些理解
**
Save data in a local database using Room
**
Room在SQLite上提供了一个抽象层,以便在利用SQLite的全部功能的同时使流畅的数据库访问。
Database :在运行时,您可以通过调用Room.databaseBuilder()或Room.inMemoryDatabaseBuilder()获取一个实例
Entity:表示一个保存数据库行的类。对于每个实体,创建一个数据库表来保存项目。您必须通过Database类中的entities数组引用实体类。实体的每个字段都保存在数据库中,除非您使用@Ignore注释它
实体可以有空构造函数(如果DAO类可以访问每个持久化字段),或者一个构造函数的参数包含类型和名称与实体中的字段匹配的构造函数。
DAO:表示作为数据访问对象(DAO)的类或接口。 DAO是Room的主要组件,负责定义访问数据库的方法。用@Database注释的类必须包含一个具有0个参数的抽象方法,并返回使用@Dao注释的类。在编译时生成代码时,Room创建一个这个类的实现。
例子:
User.java
@Entity
public class User {
@PrimaryKey
private int uid;
@ColumnInfo(name = "first_name")
private String firstName;
@ColumnInfo(name = "last_name")
private String lastName;
// Getters and setters are ignored for brevity,
// but they're required for Room to work.
}
UserDao.java
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAll();
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
List<User> loadAllByIds(int[] userIds);
@Query("SELECT * FROM user WHERE first_name LIKE :first AND "
+ "last_name LIKE :last LIMIT 1")
User findByName(String first, String last);
@Insert
void insertAll(User... users);
@Delete
void delete(User user);
}
AppDatabase.java
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
使用
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name").build();
Defining data using Room entities
在使用room时候,定义相关字段的实体。一个实体都是对应一张表。
@Ignore:在字段上面注解,表示不映射到数据库表。
@PrimaryKeys:定义一个或者多个主键,如@Entity(primaryKeys = {“firstName”, “lastName”})
@PrimaryKey:定义单个主键
autoGenerate: ture 表示自动增长ID
@Entity(tableName = "users",indices = {@Index("name"),
@Index(value = {"last_name", "address"}, unique = true)})
public class User {
@PrimaryKey(autoGenerate=true)
public int id;
@ColumnInfo(name = "first_name")
public String firstName;
public String lastName;
@Ignore //不映射到数据库表
Bitmap picture;
}
关系
因为SQLite是一个关系数据库,您可以指定对象之间的关系。即使大多数ORM库允许实体对象相互引用,Room严禁这一点。
即使您不能使用直接关系,Room仍允许您在实体之间定义Foreign Key约束。
@Entity(foreignKeys = @ForeignKey(entity = User.class,
parentColumns = "id",
childColumns = "user_id"))
public class Book {
@PrimaryKey
public int bookId;
public String title;
@ColumnInfo(name = "user_id")
public int userId;
}
ForeignKey非常强大,因为它们允许您指定引用实体更新时发生的情况。例如,如果通过在@ForeignKey注释中包含onDelete = CASCADE删除了相应的User实例,则可以告诉SQLite删除用户的所有book。
嵌套对象
有时候,您希望在数据库逻辑中表达一个实体或普通的Java对象(POJO),即使对象包含多个字段。在这些情况下,您可以使用@Embedded注释来表示要在表中分解为子字段的对象。然后,您可以像其他单独的列一样查询嵌入的字段。
例如,我们的User类可以包含一个Address类型的字段,它表示一个名为street,city,state和postCode的字段的组合。要将表格中单独存储组合列
public class Address {
public String street;
public String state;
public String city;
@ColumnInfo(name = "post_code")
public int postCode;
}
@Entity
public class User {
@PrimaryKey
public int id;
public String firstName;
@Embedded(prefix = "foo_")//
public Address address;
}