Android Room 自定义改查

Room

Room谷歌推出的用于持久化数据存储的一个库,说白了就是数据库技术。如果有项目中有用到sqlite相关东西的同学,可以学习一下,用起来还是很方便的。
由于公司项目需要用到Room ,自己也花了一段时间学习了一下这个新技术。这里就详细的分享一下吧!我之所以说很细,其实是有几个关键点。翻阅了一些资料,但是很多东西还是没找到
这里只单纯介绍Room这个框架的使用,至于和rxjava或者是mvvm的联动。暂且不做介绍。
主要了解三个模块:Dao,Entity,Database
模块也非常清晰,dao是中间层。用于对数据库的增删改查,Database就是数据库本身了。而Entity是数据库表在java中的bean类的映射,这个也很好理解了,你需要新建一个bean去对应到表的列接受序列化数据。
Entity
entity是没什么好说的,其实就是bean类了。Room作为jetpack组件中的一员,基本也是用注解来实现功能,简单明了。
新建一个bean类

@Entity(tableName = "user",indices = {@Index("id")})
public class UserEntity {

    @NonNull
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "_id")
    String id;
    
    @Ignore
    String name;
}

注解Entity作用于类上,代表该类是一个Entity,还有很多注解用法都比较基础 在很多博客中都可以看到。这些我也不想赘述。说几个关键点:

  1. 注解@TypeConverters({Convert.class}) 可以作用于类。作用是什么呢,我们知道,数据库表存数据类型只能存基本数据类型,如果我们想存一个bean类,当然可以再建一张表然后设置外键,也可以使用这个TypeConverters。顾名思义,将bean类进行一个转换,转成基本类型,一般可以使用Gson将bean类转成json字符串。Convert这个工具就用来提供转换方法。
  2. 正常情况下其实我们常常会有一个bean 的基类,这个在Entity中其实也是支持的。可以继承。基类的某个变量如需要注解,也就直接加上即可。
    **注意:**不过要注意,每一个变量一定要开放出来,要么设置成public,要么生成get/set方法。
    如:
//基类
@Entity
public class BaseEntity {
    
    @NonNull
    @PrimaryKey(autoGenerate = true)
    public int id;
}

//继承类
@Entity(tableName = "user",indices = {@Index("id")})
public class UserEntity extends BaseEntity{
//
    @Ignore
    String name;

    String age;
}

Dao
同样的,这篇文章只讲技巧,不想再去赘述其他基本用法。
1.dao层是用来操作数据的,也就是增删改查。同样对应四个注解@Insert,@Update,@Query,@Delete。
其实@Insert,@Update,和@Delete都没啥好说的,就正常可以理解的用法。
传进去的参数是Entity类,以主键作为操作唯一标识。
@Insert 和 @Update 注解有一个比较重要的参数 onConflict,可以用来处理冲突的情况。
重点说一下@Query,这个是最常用的,其实在开发中对数据的update操作@Update是很难用上的,因为我们要更新的可能仅仅是某个字段,当然你可以先吧数据查出来再更新bean然后再update如下:

@Dao
public Interface UserDao{

    @Query(" SELECT * FROM user WHERE id = :id")
    void  getDataById(String id);

    @Update
    void update(UserEntity  entity);
}

//更改age
    UserEntity entity = getUserDao().getDataById(1);
    entity.setAge("213");
    getUserDao().update(entity);

这样显得有点笨。就可以用Query了

@Query("UPDATE user SET age = :age WHERE id = :id")
int updateAgeById(String age,int id);

像这样,里面的参数是sql语句,那么发挥的空间就非常大了!注意参数一定要一一对应上,使用的时候加:就行了,其实非常简单,idea有自动补全的。至于sql语句。如果不太熟悉的朋友可以去
https://www.runoob.com/sqlite/sqlite-installation.html
学习一下。也是很容易掌握的。
但是最关键的其实还不是这个,一般如果逻辑需要严谨一点的话,对于数据库的增删改是会有结果返回的,返回的就是修改的行的数量,这个query也是支持的!这样一来就可以随心使用了。上面这个那个示例,返回了一个int值,代表更新的行数。就像操作数据库一样,自己写sql语句,然后传需要的参数就行了。
这样一来之前使用其他框架的功能基本都能移植了。有这个返回值,对于代码的严谨性也没有问题。
Database其实没有什么技巧,主要就是升级麻烦一点。看看谷歌官方文档就很清晰了。
今天分享到这里了,谢谢!

你可能感兴趣的:(jetpack,Android)