Android Jetpack - Room 介绍
2018-12-25 本文已影响270人
Linhaojian
Jetpack.jpg
冲突条款 : 就是针对出现约束异常(ROLLBACK, ABORT, FAIL, IGNORE, and REPLACE)的非标准处理。
1.前言
- 2018年谷歌I/O 发布了一系列辅助android开发者的实用工具,合称 Jetpack ,以帮助开发者构建出色的 Android 应用。
- Jetpack 包含4个部分的组件:Architecture、Foundation、Behavior 以及 UI 。
- 今天为大家介绍的是 Architecture 中
Room
。 - 文章中实例 linhaojian的Github
2.简介
- 介绍 :
Room 是Google为了简化旧式的SQLite操作专门提供的一个覆盖SQLite抽象层框架库 - 作用:
1.实现SQLite的增、删、查、改功能。 - 特点:
1.使用简单(类似于Retrofit库),通过注解的方式实现相关功能。
2.拥有SQLite的所有操作功能(表所有操作、版本升级....)。
3.说明
- 主要角色说明
- Bean : 实体类,表示数据库表的数据。
- Dao : 数据操作类,包含用于访问数据库的方法。
- Database : 数据库持有者 & 数据库版本管理者。
- Room : 数据库的创建者 & 负责数据库版本更新的具体实现者。
- 注释说明
1.Bean(实体)- @Entity : 数据表的实体类。
- @PrimaryKey : 每一个实体类都需要一个唯一的标识。
- @ColumnInfo : 数据表中字段名称。
- @Ignore : 标注不需要添加到数据表中的属性。
- @Embedded : 实体类中引用其他实体类。
- @ForeignKey : 外键约束。
@Entity
public class User {
@PrimaryKey(autoGenerate = true)//autoGenerate 为true时,自增;
private int uid;
@ColumnInfo(name = "name")
private String name;
@Ignore
private String remark;
@Embedded
public Address address;
}
public class Address {
public String street;
public String state;
public String city;
@ColumnInfo(name = "post_code")
public int postCode;
}
@Entity(foreignKeys = @ForeignKey(entity = User.class,
parentColumns = "uid",
childColumns = "user_id"))
public class Book {
@PrimaryKey
public int bookId;
public String title;
@ColumnInfo(name = "user_id")
public int userId;
}
2.Dao(数据库操作类)
- @Dao : 标注数据库操作的类。
- @Query : 包含所有Sqlite语句操作。
- @Insert : 标注数据库的插入操作。
- @Delete : 标注数据库的删除操作。
- @Update : 标注数据库的更新操作。
@Dao
public interface UserDao {
@Query("Select * from user")
List<User> getAll();
@Query("Select * from user Where uid In (:userIds)")
List<User> loadAllByIds(int[] userIds);
@Insert
void insertAll(User... users);
@Delete
void delete(User... users);
@Update
void update(User... users);
@Query("update user set name =:name1 where uid=:uid")
void updateCustom(String name1, int uid);
}
3.Database(数据库持久化)
- @Database : 标注数据库持久化的类。
@Database(entities = {User.class},version = 1)
public abstract class AppDataBase extends RoomDatabase {
public abstract UserDao getUserDao();
}
4.基本使用
4.1 Lib引用
// room
implementation 'android.arch.persistence.room:runtime:1.1.1'
annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
4.2 User 实体
@Entity
public class User {
@PrimaryKey(autoGenerate = true)//autoGenerate 为true时,自增;
private int uid;
@ColumnInfo(name = "name")
private String name;
}
4.3 Dao 操作类
@Dao
public interface UserDao {
@Query("Select * from user")
List<User> getAll();
@Insert
void insertAll(User... users);
@Delete
void delete(User... users);
@Update
void update(User... users);
}
4.4 DataBase 数据库持久化
@Database(entities = {User.class},version = 1)
public abstract class AppDataBase extends RoomDatabase {
public abstract UserDao getUserDao();
}
4.5 Room初始化
每一次初始化数据库对象都需要消费较大的资源,因此可以通过单例的方式,实现一个进程中公用一个数据库对象。
public class DBInstance {
private static final String DB_NAME = "room_test";
public static AppDataBase appDataBase;
public static AppDataBase getInstance(Context context){
if(appDataBase==null){
synchronized (DBInstance.class){
if(appDataBase==null){
return Room.databaseBuilder(context,AppDataBase.class, DB_NAME)
.build();
}
}
}
return appDataBase;
}
}
4.6 应用
通过DbInstance获取AppDataBase单例 & 操作User数据表
//获取数据
List<User> list = DBInstance.getInstance(getApplicationContext()).getUserDao().getAll();
//插入数据
User user = new User();
user.setName("linhaojian");
DBInstance.getInstance(getApplicationContext()).getUserDao().insertAll(user);
//更新数据
user.setUid(1);
user.setName("linhaojian");
DBInstance.getInstance(getApplicationContext()).userDao().update(user);
//删除数据
DBInstance.getInstance(getApplicationContext()).getUserDao().delete(user);
5.进阶
5.1 版本更新
- 在User对象中,添加多一个属性:sex,看看修改的步骤有哪些:
1.User实体中添加sex属性
@Entity
public class User {
@PrimaryKey(autoGenerate = true)//autoGenerate 为true时,自增;
private int uid;
@ColumnInfo(name = "name")
private String name;
@ColumnInfo(sex= "sex")
private String sex;
}
2.修改DateBase的版本信息 1 -> 2
@Database(entities = {User.class},version = 2)
public abstract class AppDataBase extends RoomDatabase {
public abstract UserDao getUserDao();
}
3.添加一个Migration & 实现版本更新的具体内容
public static Migration MIGRATION_1_2 = new Migration(1,2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("alter table user add column sex text");
}
};
4.在数据库初始化中添加Migration
Room.databaseBuilder(context,AppDataBase.class, DB_NAME)
.addMigrations(
VersionDataBase.MIGRATION_1_2)
.build()
完成上述4个步骤就可以更新数据库,非常方便,不再像旧式Sqlite需要修改实体类、数据库更新类,还要修改具体的数据表操作的相关方法(增删查改)。
5.2 冲突条款(ON CONFLICT)
conflict-clause.gif冲突条款 : 就是针对出现约束异常(ROLLBACK, ABORT, FAIL, IGNORE, and REPLACE)的非标准处理。
- ABORT : 默认值,不处理约束异常。
- ROLLBACK : 与ABORT相似,不常用。
- FAIL : 在批量更新或者修改时,中途出现了约束异常,就会终止后续执行,但会保留已执行的sql语句。
- IGNORE : 忽略约束异常,不做任何处理保留原数据。
- REPLACE : 当出现约束异常时,移除原数据 & 将新数据覆盖。
- 使用方式
@Insert(onConflict = OnConflictStrategy.IGNORE)
@Update(onConflict = OnConflictStrategy.REPLACE)
6.总结
- 到此,
Room
就介绍完成了。后续我会进行分享Jetpack更多其他内容。 - 如果喜欢我的分享,可以点击 关注 或者 赞,你们支持是我分享的最大动力 。
- linhaojian的Github
欢迎关注linhaojian_CSDN博客或者linhaojian_简书!
不定期分享关于安卓开发的干货。
写技术文章初心
- 技术知识积累
- 技术知识巩固
- 技术知识分享
- 技术知识交流