Android JectPack系列:Room
Jetpack 是 Android 软件组件的集合,使您可以更轻松地开发出色的 Android 应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您可以专注于您关心的代码。
Jetpack 包含与平台 API 解除捆绑的 androidx.* 软件包库。这意味着,它提供向后兼容性并且比 Android 平台更频繁地更新,从而确保您始终可以获取最新且最好的 Jetpack 组件版本。
Room 组件是Android JectPack 的构成之一。Google 官方对于Room的概括:一个在SQLite上提供抽象层的持久存储库。Room 通过一系列针对数据访问、迁移、测试、以及线程安全的特性,帮助开发者更加轻松愉快的操作数据库,从而创建出更加优质的应用。
Room主要包含三个组件:
Database(数据库)注解:可以使用该组件创建来创建一个数据库的持有者,该注解定义了实体列表,该类的内容定义了数据库中的Dao列表。这也是访问数据库的主要入口。该类应该是继承RoomDatabase的抽象类。可以通过Room.databaseBuilder或者Room.inMemoryDatabaseBuilder() 方法获取实例。
Entity(实体)注解:该注解定义了数据库所持有的表,对于一个实例类来说,数据库会创建相应的表去持久化该类的所有项。该类在Database注解类中,通过Database的@entities 属性来引用,默认情况下,实体类中的所有字段都会被持久化在数据库中,除了那些被@Ignore 注解标记忽略的字段。(实体类可以拥有无参构造函数,或者拥有全部或者部分成员变量的构造函数)
Dao(数据访问对象):该注解表示作为数据访问对象(Dao)的类,或者接口,Dao在Room组建中扮演着极为重要的角色,Dao 中定义了负责访问数据库的方法。在由@Database标记的类中必须包含一个无参数并且返回@Dao注解的类的抽象方法。
使用步骤
创建Entity(实体)
@Entity(tableName="user")
public classUser {
@PrimaryKey
private intuid;
@ColumnInfo(name="first_name")
privateStringfirstName;
@ColumnInfo(name="last_name")
privateStringlastName;
@Ignore
private intage;
}
@Entity(tableName = "user"),@Entity 用来注解实体类,定义数据库的表结构;tableName 用来定义数据库表名(非必须,默认使用类名作为表名)。
@PrimaryKey 定义主键。
@ColumnInfo(name=""),用来定义字段名,非必须,默认使用变量名称。
@Ignore ,用来注解变量或者方法,告知Room该变量或者方法被忽略。
1
创建Dao(数据访问对象)
@Dao
public interfaceUserDao {
@Query("select * from user")
ListgetAllUser();
@Query("select * from user where uid in (:userIds)")
ListloadAllByIds(int[] userIds);
@Query("select * from user where first_name like :firstName and "+
"last_name like :lastName limit 1")
UserfindByName(String firstName,String lastName);
@Insert
voidinsertAll(User... users);
@Delete()
voiddeleteUser(User user);
}
Dao 可以是一个接口,也可以是一个抽象类,Room组件在编译时会自动创建Dao的实现
@Query() 查询,如上文所示,既可以是带参数的查询,也可以是不带参数的查询,使用极为简单。
@Insert 插入方法
@Delete 删除方法
2
创建Database(数据库对象)
@Database(entities=,version=1)
public abstract classAppDatabaseextendsRoomDatabase {
private staticAppDatabaseinstance;
private static finalObjectslock=newObject();
public abstractUserDaouserDao();
public staticAppDatabasegetInstance(Context context) {
synchronized(slock) {
if(instance==null) {
instance= Room.databaseBuilder(context,AppDatabase.class,"user.db").build();
}
returninstance;
}
}
}
必须继承RoomDataBase,并且是一个抽象类
用@Database 注解,并定义相关的entity对象
定义返回DAO对象的抽象方法
3
此篇内容只是Room组件的基本使用方法,下篇博客将更深入的介绍Room组件,敬请期待!
END
领取专属 10元无门槛券
私享最新 技术干货