随着Android X 库加入,Jetpack库中的框架也越来越多的人使用了,这几天去研究了下Jetpack库中的Room框架,今天跟大家分享下。
一、简介
1.Room是Goole发布的一个Sqlite数据库。它提供了SQLite的抽象层,以便在充分利用SQLite的同时允许流畅的数据库访问。
Room框架的三个重要组成部分:
AppDatabase(数据库)、@Entity(实体类)、@Dao(操作层)
2.优势:
① SQL查询在编译时就会验证 - 在编译时检查每个@Query和@Entity等,这就意味着没有任何运行时错误的风险可能会导致应用程序崩溃(并且它不仅检查语法问题,还会检查是否有该表)
② 较少的模板代码
③ 与 LiveData集成
二、集成
1.项目根目录build.gradle添加maven{url'https://jitpack.io'}
allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
}
}
2.APP的build.gradle添加Room引用库
implementation 'androidx.room:room-runtime:2.2.5'
implementation 'androidx.room:room-compiler:2.2.5'
重新编译一下即可。
三、使用Room框架进行增删改查操作
(一)、AppDatabase、Entity、Dao三者的创建
1.Entity(实体类)创建
@Entity(tableName = "user_info") tablename:定义数据库表中的名字,默认是以类名为表明
public class UserInfo {
@NonNull
@PrimaryKey(autoGenerate = true) :主键注解,autoGenerate 是否自增长
@ColumnInfo(name = "uuid") :声明数据库表中的字段名
public int uid;
@ColumnInfo(name = "user_name")
public String userName;
@Ignore
public UserInfo() {
}
public UserInfo(Integer uid, String userName) {
this.uid = uid;
this.userName = userName;
}
}
实体类定义必须确认下面几点,否则编译不通过:
1.类名顶部添加@Entity注解
2.Entity必须有一个字段声明为主键,即需要加@PrimaryKey注解,且加@NonNull注解
3.Entity中如果有无参构造的话,必须加 @Ignore注解
2.Dao层创建
@Dao
public interface UserInfoDao {
@Query("SELECT * FROM userinfo ORDER BY uuid ASC")
List<UserInfo> getAll();
//查单独的
@Query("SELECT * FROM userinfo WHERE uuid = :number")
UserInfo getUser(String number);
//查数组
@Query("SELECT * FROM userinfo WHERE uuid IN (:numbers)")
List<UserInfo> getUsers(List<String> numbers);
@Insert
void insertAll(UserInfo... users);
@Delete
void delete(UserInfo user);
//写语句需要 用 Query 处理
@Query("UPDATE userinfo SET user_name=:name WHERE uuid=:number")
void update(String number, String name);
//更新全部字段,需添加onConflict = OnConflictStrategy.REPLACE
@Update(onConflict = OnConflictStrategy.IGNORE)
int update(UserInfo info);
}
Dao注意事项
1.Dao层顶部添加@Dao注解;
2.Dao文件可以是接口,也是可以是抽象类
3.数据库创建
定义一个抽象类并继承RoomDatabase 数据库.png创建.png
特别说明
1.若想导出数据创建文件,可以在APP的build.gradle的defaultConfig中添加下面代码,项目运行成功后,在项目根目录下会增加schemas文件夹。
javaCompileOptions {
annotationProcessorOptions {
includeCompileClasspath = true
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
(二)、数据的增删改查操作,下面是以用户Dao层为实例
//增加
@Insert
void insertAll(UserInfo... users);
//修改,需添加onConflict = OnConflictStrategy.REPLACE
@Update(onConflict = OnConflictStrategy.IGNORE)
int update(UserInfo info);
//查询
@Query("SELECT * FROM userinfo ORDER BY uuid ASC") :ASC :降序
List<UserInfo> getAll();
//查单独的
@Query("SELECT * FROM userinfo WHERE uuid = :number")
UserInfo getUser(String number);
//查数组
@Query("SELECT * FROM userinfo WHERE uuid IN (:numbers)")
List<UserInfo> getUsers(List<String> numbers);
@Insert
void insertAll(UserInfo... users);
//删除
@Delete
void delete(UserInfo user);
注:这里只是一些数据库的基本操作,如果需要更复杂的数据库操作,需要自己去写SQL语句
(三)、具体调用(以数据查询操作为例,其他的类似就不写了,有问题可以随时私聊我或是在评论区留言)
//请求列表数据
void requestList() {
@SuppressLint("StaticFieldLeak")
AsyncTask task = new AsyncTask<Object, List<UserInfo>, List<UserInfo>>() {
@Override
protected List<UserInfo> doInBackground(Object[] objects) {
List<UserInfo> userInfos = JetpackApplication.getApp().getAppDatabase().userInfoDao().getAll();
return userInfos;
}
@Override
protected void onPostExecute(List<UserInfo> userInfos) {
super.onPostExecute(userInfos);
mAdapter.setNewInstance(userInfos);
}
};
task.execute();
}
看到这里,想必大家也会有疑问?为什么要用AsyncTask 异步去请求呢?这个是因为>Room框架的所有操作都不能在UI线程中操作,否则会抛异常
IllegalStateException:Cannot access database on the main thread since >it may potentially lock the UI for a long period of time .
到此,Room框架的基本操作已分享。自己动手试一试吧!
如果你觉得该项目对你有用,动动你的小手指,举手之劳,赞有余香!
网友评论