本文源码请戳:AndroidRoom MVVM架构示例

 

记录几个国内的android studio使用的maven代理地址

maven { url 'https://maven.aliyun.com/repository/google' }maven { url 'https://maven.aliyun.com/repository/jcenter' }maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }

 

 

最近从谷歌官网了解了一下安卓的MVVM架构,看到Room这个东西,感觉不错,实现了安卓端的显示与数据解耦,是一个开发过程中不错的架构。这是谷歌自己推出的一个架构,关于程序的架构模型从最早的mvc到后来的mvp,再到mvvm实际上都是为了实现显示与操作与数据模型的解耦,安卓从一开始设计的时候就赋予了activity太重的负担,故导致后来很多开发者在开发过程中发现ativity的臃肿庞大,包括安卓源码中一个activity或者一个service中动辄几千甚至上万行代码。导致代码阅读维护以及理解的过程中费时费力。后来安卓推出了MVVM架构,其中最主要的是添加了ViewModel这个模块实现了UI Control与Data的解耦分离。以上纯属个人一些浅析理解,有错误的地方欢迎大家指出,提出自己的见解。Room这个架构还是不错,将数据操作完全隔离开,支持数据库的访问,甚至可以扩展到互联网数据,你不用担心自己应用的临时数据在一个屏幕旋转的过程中丢失,甚至你可以实现在各个UI界面实现数据的共享,而且可以实现实时数据的更新后直接更新自己的界面,当然这里要用到谷歌的LiveData,后续这些都会在下面的实例中得到体现。在进入实例之前还要介绍一下这个架构的整体结构,下面是一张谷歌的图我们把它贴出来

首先简单介绍一下上图中各个模块的作用。UI Controller这里可以理解成activitiy或者fragment等安卓用来显示数据以及操作的界面。 ViewModel就是用来操作数据的一个接口,这里起到承上启下的作用,它可以向上为界面提供数据,而且通知界面数据的变化,以便于界面根据数据的变化做相应的界面的更改,这里使用起来就比较灵活了,读者可以自己发挥,让自己的界面根据数据动起来,这里的动态数据监控要归功于LiveData这个类,它是谷歌推出的一个实现实时数据监控的一个类,一个数据观察者模式的实现,viewmodel的数据实时监控就是由它来完成。向下它可以连接数据,这里的数据被一个Reppsitory仓库进行了隔离,实现了数据的解耦,对ViewModel来讲只需要从仓库里来拿数据,而不用考虑数据哪里来的,这就像一个工厂仓库一样,ViewModel不需要知道原料的来源,只需要提取就可以了。而这个仓库再去自己管理数据的来源,Repository与RoomDatabase进行交互,通过RoomDatabase的DAO数据操作接口操作更底层的数据,可以实现增删改查的功能,DAO接口的封装读者可以根据自己的需求灵活变化,可以是本地数据库也可以是互联网数据,本文的介绍是操作安卓本地的SQLite数据库。实现数据的本地操作。

 

 

 

下面以一个自己参考谷歌的实例来简介一下Room架构的使用,使用android studio开发。

一、准备动作。

首先在root的build.gradle中添加

repositories {    google()    jcenter()    maven { url 'https://kotlin.bintray.com/kotlinx/' }}

这里主要是为了引入kotlin的使用,不添加后面可能会导致编译过程的报错。支持kotlin,因为Room底层的一些代码可能是使用kotlin编写的,所以必须支持这个东西。

然后在自己的模块build.gradle中添加如下引用库。

implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.room:room-runtime:2.1.0-alpha04'implementation 'androidx.legacy:legacy-support-v4:1.0.0'annotationProcessor 'androidx.room:room-compiler:2.1.0-alpha04'implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha03'implementation 'androidx.lifecycle:lifecycle-viewmodel:2.1.0-alpha03'implementation 'androidx.lifecycle:lifecycle-livedata:2.1.0-alpha03'annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.1.0-alpha03'

我这里使用的是2.1.0的版本。

到这里使用Room架构的基本准备工作已经完成了

 

二、创造自己的原料(数据模型)

 

这里创造一个叫做Word的数据模型,谷歌示例里创造的就是这个,自己懒得再造一个了。这个类对应上图中的Entity模块,内容如下:

 

@Entity(tableName = "word_table")public class Word {    @PrimaryKey    @NonNull    @ColumnInfo(name = "word")    private String mWord;    public  Word(@NonNull String word){        this.mWord = word;    }    @NonNull    public String getWord(){        return this.mWord;    }}

 

可以看到使用了很多注解,没错,这里与底层数据库的连接操作离不开这些注解。

这里可以看作将数据与数据库的连接方式,当我们创建数据库的时候肯定需要一个主键,就是这里的PrimaryKey这里如果不指定的话会自己生成一个主键。一个数据库当然也离不开一张表,我们需要给这个表起一个名字,当我们开始定义这个数据模型的时候首先考虑的就是创建这张表,这里使用Entity关键字作为数据入口,这里定义表名,我们这里叫做word_table。然后介绍一下这个NonNull这个就是不允许为空,我们创建数据库的时候有些数据是不允许为空的,这里也是同理。那么接下来我们要定义表里面的项了,这里可以看到ColumnInfo这一项,这就相当于表里面的一个列选项,这一列数据我们叫做word,这里最终保存的就是我们的字符串了。那么这个Entity可以理解为一个SQLite数据库的入口。

 

 

 

 

 

 

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  4. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  5. Android(安卓)首页轮播图实现
  6. Android传感器学习总结
  7. SharedPreferences存储数据的使用方法(转)
  8. Android:Activity(二):Bundle的作用
  9. Android(安卓)创建fragment时向fragment中传数据

随机推荐

  1. Cocos2D-HTML5 Android项目编译
  2. Android LinearLayout Weight issues
  3. Android中显示进度的控件
  4. 今天和大家讲一下怎么样简单的把壁纸作为
  5. android 文件读取总结
  6. 修改Android framework源码报错(You have
  7. Install App to SD
  8. 关于android:launchMode=“singleInstanc
  9. Android中使用SharedPreferences进行数据
  10. android启动过程配置文件的解析与语法