关于Room

Room是Google官方提供的数据库ORM框架,使用起来非常方便。Room在SQLite上提供了一个抽象层,以便在利用SQLite的全部功能的同时能更加流畅的访问数据库。

Room中三个主要组件:

  • Database:该组件用来创建一个database holder。注解定义实体的列表,类的内容定义从数据库中获取数据的对象(DAO)。它也是底层连接的主要入口。这个被注解的类是一个继承RoomDatabase的抽象类。在运行时,可以通过调用Room.databaseBuilder() 或者 Room.inMemoryDatabaseBuilder()来得到它的实例。

  • Entity:该组件的一个示例表示数据库的一行数据,对于每个Entity类来说,都会有对应的table被创建。想要这些Entity被创建,就需要卸载上面的Database的注解参属entities列表中,默认Entity中的所有字段都会来创建表,除非该字段上加上@Ignore注解。

  • Dao:该组件用来表述具有Data Access Object(DAO)功能的类或者接口,DAO类时Room的重要组件,负责定义查询(添加或者删除等)数据库的方法。使用@Database注解的类中必须定义一个不带参数的抽象方法,这个方法返回使用@Dao注解的类,返回类型为@Dao注解过的类的抽象方法Room会在编译时生成这个类的实现。

添加Room库的依赖

首先在Google的Maven存储库(项目最外层的build.gradle文件中添加如下:

allprojects {    repositories {        jcenter()        google()    }}

然后再app/build.gradle文件中添加相关依赖

dependencies {    compile fileTree(include: ['*.jar'], dir: 'libs')    // Room依赖    implementation 'android.arch.persistence.room:runtime:1.0.0'    annotationProcessor "android.arch.persistence.room:compiler:1.0.0"    ......}

定义Entity

当一个类用 @Entity 注解并且被 @Database 注解中的 entities 属性所引用,Room就会在数据库中为这个被 @Entity 注解的类创建一张表。

PrimaryKey

每个Entity必须至少有一个主键(Primary Key),即使只有一个属性,也要使用@PrimaryKey来注释这个属性。如果想让Room为Entity设置自增ID,需要设置@PrimaryKey的autoGenerate属性。

ColumnInfo

如果想要自定义表中的字段时,需要在属性上面加上 @ColumnInfo 注解,如:@ColumnInfo(name = "ID"),"ID"为自定义字段名。

@Entity(tableName = "PHONE")public class PhoneBean implements Parcelable {

    @PrimaryKey(autoGenerate = true) // 设置主键    @ColumnInfo(name = "ID") // 定义对应的数据库的字段名成    private int id;

    @ColumnInfo(name = "PHONE")    private String phone;

    @ColumnInfo(name = "NAME")    private String name;

    @ColumnInfo(name = "DATE")    private Date date;

    public PhoneBean(String phone, String name, Date date) {        this.phone = phone;        this.name = name;        this.date = date;    }

    public int getId() {        return id;    }

    public void setId(int id) {        this.id = id;    }

    public String getPhone() {        return phone;    }

    public void setPhone(String phone) {        this.phone = phone;    }

    public String getName() {        return name;    }

    public void setName(String name) {        this.name = name;    }

    public Date getDate(){        return date;    }

    public void setDate(Date date) {        this.date = date;    }

    @Override    public int describeContents() {        return 0;    }

    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeInt(this.id);        dest.writeString(this.phone);        dest.writeString(this.name);        dest.writeLong(this.date != null ? this.date.getTime() : -1);    }

    protected PhoneBean(Parcel in) {        this.id = in.readInt();        this.phone = in.readString();        this.name = in.readString();        long tmpDate = in.readLong();        this.date = tmpDate == -1 ? null : new Date(tmpDate);    }

    public static final Parcelable.Creator<PhoneBean> CREATOR = new Parcelable.Creator<PhoneBean>() {        @Override        public PhoneBean createFromParcel(Parcel source) {            return new PhoneBean(source);        }

        @Override        public PhoneBean[] newArray(int size) {            return new PhoneBean[size];        }    };}

定义转换

TypeConverter

使用@TypeConverter注解定义转换的方法,如下,将Date类型的数据转换成Long类型来存储。

public class ConversionFactory {

    @TypeConverter    public static Long fromDateToLong(Date date) {        return date == null ? null : date.getTime();    }

    @TypeConverter    public static Date fromLongToDate(Long value) {        return value == null ? null : new Date(value);    }}

如图,示例中将Date属性值转换为Long类型存储到数据库

Room创建的数据库表

读取到数据库的Date属性值,再将Date属性值转换为字符串显示

读取到的Date字段值

定义Dao

Dao组件定义一系列的增删改查操作。其中 Update 和 Detele 操作是根据定义的主键进行。

@Daopublic interface PhoneDao {

    /**     * 查询所有     *     * @return     */    @Query("SELECT * FROM PHONE")    List<PhoneBean> getPhoneAll();

    /**     * 根据指定字段查询     *     * @return     */    @Query("SELECT * FROM PHONE WHERE phone = :phone")    List<PhoneBean> loadPhoneByIds(String phone);

    /**     * 项数据库添加数据     *     * @param phone     */    @Insert(onConflict = OnConflictStrategy.REPLACE)    void insertAll(List<PhoneBean> phone);

    /**     * 修改数据     *     * @param phone     */    @Update()    void update(PhoneBean phone);

    /**     * 删除数据     *     * @param phoneBean     */    @Delete()    void delete(PhoneBean phoneBean);}

创建数据库

@Database(entities = {PhoneBean.class}, version = 1, exportSchema = false)@TypeConverters({ConversionFactory.class})public abstract class PhoneDatabase extends RoomDatabase {

    public static PhoneDatabase getDefault(Context context) {        return buildDatabase(context);    }

    private static PhoneDatabase buildDatabase(Context context) {        return Room.databaseBuilder(context.getApplicationContext(www.caibaoyule.cn ), PhoneDatabase.class, "PHONE.db")                .allowMainThreadQueries()                .build();    }

    public abstract PhoneDao getPhoneDao();}

使用

增加
private void insertPhone(String mName, String mPhone) {    List<PhoneBean> mPhones = new ArrayList<>();    mPhones.add(new PhoneBean(mPhone, mName));    PhoneDatabase.getDefault(getApplicationContext(www.douniu178.com)).getPhoneDao().insertAll(mPhones);}
查询
private void queryPhone(www.micheng178.com ) {    List<PhoneBean> mPhoneLists = PhoneDatabase.getDefault(getApplicationContext()).getPhoneDao().getPhoneAll();    // 其他代码......}
修改
private void updatePhone(String name, String phone) {    PhoneDatabase.getDefault(getActivity(www.255055.cn).getApplicationContext(www.huayi1.cn/ )).getPhoneDao().update(new PhoneBean(phone, name));    // ......}
删除
private void deletePhone(www.senta77.com) {    PhoneDatabase.getDefault(getActivity(www.leyouzaixan.cn).getApplicationContext(www.yibaoyule1.com/)).getPhoneDao().delete(mPhoneBean);    // ......}

查看案例源代码
https://github.com/mengjingbo/RoomSample

Android 架构组件 Room 介绍及使用的更多相关文章

  1. Android架构组件——ViewModel

    概述 ViewModel,从字面上理解的话,它肯定是跟视图(View)以及数据(Model)相关的.正像它字面意思一样,它是负责准备和管理和UI组件(Fragment/Activity)相关的数据类, ...

  2. Android新组件RecyclerView介绍,其效率更好

    今天我们首先来说为什么要介绍这个新组件RecyclerView,因为前几天我发布了一个常用面试题ListView的复用及如何优化的文章,介绍给一些开发者,但是我看到有关的反馈说:现在都不再用listv ...

  3. Android常用组件Broadcast介绍

    一.Broadcast简介 Broadcast是Android的四大组件之一.可分为: 1.普通广播 发送一个广播,所有监听该广播的广播接收者都可以监听到改广播. 2.异步广播 当处理完之后的Inte ...

  4. Android 架构组件-Lifecycle、LiveData、ViewModel

    Lifecycle Lifecycle组件包括LifecycleOwner.LifecleObserver,能方便监听Activity或者Fragment的生命周期. 步骤: 1.实现Lifecycl ...

  5. Android官方架构组件介绍之LifeCycle

    Google 2017 I/O开发者大会于近日召开,在开发者大会上谷歌除了发布了Android O等一些新产品之外,也对Android代码的架构做出了一个官方的回应. Google 2017 I/O开 ...

  6. Android官方架构组件介绍之LifeCycle(一)

    Android官方架构组件介绍之LifeCycle 下面是官方提供的Android App开发的架构图: 从上图可以看到一些关键字:ViewModel,LiveData,Room等.其实看了上面视频的 ...

  7. Android官方架构组件指南

    此指南适用于那些曾经或现在进行Android应用的基础开发,并希望了解和学习编写Android程序的最佳实践和架构.通过学习来构建强大的生产级别的应用. 注意:此指南默认你对Android开发有比较深 ...

  8. Jetpack 架构组件 LiveData ViewModel MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. Jetpack 架构组件 Lifecycle 生命周期 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. classList属性详解

    之前我们要操作一个DOM元素的class属性,需要对这个DOM的class进行繁琐的循环判断,而现在HTML5为每个元素定义了classLlist属性,用于在元素中添加,移除及切换 CSS 类.该属性 ...

  2. scala成长之路(5)问题记录

    还是在看scala sdk源码的时候,有很多问题要考自己慢慢摸索,这里做个记录. 一. 隐式转换的作用域? 隐式转换需要三个因素 1. 己方(当前对象) 2. 转换函数 3. 对方(转换的目标类) 这 ...

  3. JavaScript 转载

    JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECM ...

  4. 中恳中笨 搭建flask封装环境

    话不多说,先干再说..... 打开pycharm,创建一个关于flask的项目 2.创建一个App的文件包 3.把staic和templates文件包拖进App里 4.把app.py文件改为manag ...

  5. python快速改造:基础知识

    改造"Hacking"并不同于破坏"cracking" python快速改造:基础知识 一行就是一行,不管多少,不用加分号 交互式python解释器可以当作计算 ...

  6. Ubuntu装完后要做的几件事

    Ubuntu装完后要做的几件事 改hosts 无论哪里,改hosts都是第一件事,没hosts咋google.没google咋活.在终端输入命令 sudo gedit /etc/hosts在# The ...

  7. Apache Tomcat 整合

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.Apache+Tomcat整合是什么: 1.Apache默认访问端口是80,Tomcat默认访问端口是8080 ...

  8. struts2官方 中文教程 系列十一:使用XML进行表单验证

    在本教程中,我们将讨论如何使用Struts 2的XML验证方法来验证表单字段中用户的输入.在前面的教程中,我们讨论了在Action类中使用validate方法验证用户的输入.使用单独的XML验证文件让 ...

  9. 通过修改Host文件解决主机头访问网站的问题

             网站打包发布后,一般都是通过IP地址来进行访问,但是这样不方便记忆.如何设置一个简单的域名,然后通过域名来进行访问呢?一个可行的方法就是修改本机的host文件,添加一条映射关系,把这 ...

  10. jmeter更改启动编码设置

    项目中碰到这样的问题,在eclipse经过utf-8转码的代码,能正常运行,放到了jmeter里面运行,就是乱码,如下: String s = "乔佳飞"; String ss = ...