Jetpack库Room框架学习—入门篇(一)

随着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框架的基本操作已分享。自己动手试一试吧!
如果你觉得该项目对你有用,动动你的小手指,举手之劳,赞有余香!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

相关阅读更多精彩内容

友情链接更多精彩内容