美文网首页
Jetpack库Room框架学习—入门篇(一)

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

作者: 丿独狼灬望曰 | 来源:发表于2020-04-14 21:23 被阅读0次

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

    相关文章

      网友评论

          本文标题:Jetpack库Room框架学习—入门篇(一)

          本文链接:https://www.haomeiwen.com/subject/hyhxvhtx.html