Room

https://developer.android.google.cn/topic/libraries/architecture/room

Room重要概念:
Entity:实体类,对应的是数据库的一张表结构,使用注解@Entity标记>
Dao:包含访问一系列访问数据库的方法,使用注解@Dao标记。//Data Access Objects
Database:数据库持有者,作为与应用持久化相关数据的底层连接的主要接入点。使用注解@Database标记,另外需满足以下条件:定义的类必须是一个继承于RoomDatabase的抽象类,在注解中需要定义与数据库相关联的实体类列表。包含一个没有参数的抽象方法并且返回一个Dao对象。

app从Database得到get DAO,从DAO得到Entity,从Entity得到和设置对象值

implementation 'androidx.room: room-runtime: 2.2.5'
//注解器:抽象类自动生成实现类
annotationProcessor 'androidx .room:room-compiler:2.2.5'

Entity

 @Entity (tableName - "student")public class Student {@PrimaryKey (autoGenerate = true)@ColumnInfo(name = "id",typeAffinity = ColumnInfo.INTEGER)public int id;@ColumnInfo(name = "name", typeAffinity = ColumnInfo.TEXT)public string name;@columnInfo(name = "name",typeAffinity = ColumnInfo.TEXT)public int age;public student (int id,String name, int age){this.id = id;this.name = name;this.age = age;}// Ignore注解 room会自动忽略此构造函数      @Ignorespublic student (string name, int age) {this.name = name;this.age = age;}

Dao:增删查改接口类

@Dao
public interface StudentDao {@Insertvoid insertStudent (student. .- students) ;@Deletevoid deletestudent (student. . . students);@Updatevoid updateStudent (Student . . . students) ;@Query ( "SELECT *FROMstudent")List<Student> getAllstudent ();@Query ("SELECT * FROM student WHERE id = :id")List<Student> getStudentById(int id);
}

Database

@Database (entities = {Student.class}, version = 1, exportSchema = false)
public abstract class MyDatabase extends RoomDatabase {private static final string DATABASE_NAME= "my_db. db"private static MyDatabase mInstance;public static synchronized MyDatabase getInstance (Context context) {if (mInstance == nul1) {mInstance = Room. databaseBuilder(context.getApplicationContext(),MyDatabase.class,DATABASE_NAME').build() ;}return minstance;}public abstract StudentDao getStudentDao ();
}

使用

MyDatabase database = MyDatabase.getInstance (this);
studentDao = database.getStudentDao ( ) ;public void mlnsert (View view){student s1 = new Student ( name: "Jack" , age: 20) ;Student s2 = new Student( name: "Rose",age: 1 ;new      InsertStudentTask (studentDao).execute (s1);
}//room不允许在主线程执行数据库操作
class InsertStudentTask extends AsyncTask<Student, Void,void> {private studentDao studentDao;public InsertStudentTask (StudentDao studentDao){this . studentDao - studentDao;}@overrideprotected Void doInBackground (Student. . . students) {studentDao.insertStudent ( students) ;rerurn null;}
}

进一步优化

问题:每当数据库数据发生变化时,都需要开启一个工作线程去重新获取数据库中的数据。
解决:当数据发生变化时,通过LiveData通知View层,实现数据自动更新。

Room+ViewModel+LiveData

//Repository:通过Repository操作数据库
public class studentRepository {private StudentDao studentDao;public StudentRepository (Context context){MyDatabase database = MyDatabase.getInstance ( context) ;this.studentDao = database.getStudentDao ( ) ;}public void insertStudent (Student. . . students){new InsertStudentTask(studentDao) .execute (students);}class InsertStudentTask extends AsyncTask<Student, Void,Void> {private studentDao studentDao;public InsertStudentTask(StudentDao studentDao) { this.studentDa@overrideprotected Void doInBackground (Student. . . students) {studentDao.insertstudent (students) ;return nul1;}}
}//ViewModel:ViewModel传递上下文对象需要用AndroidViewModel
//ViewModel保存数据
public class studentViewModel extends AndroidViewModel {private studentRepository repository ;public StudentViewModel ( @NonNull Application application) {super(application) ;this.repository = new StudentRepository(application) ;}public void insertStudent (Student. . . students) {repository.insertStudent(students) ;}
}//Activity只需要和ViewModel交互即可
studentViewModel = new ViewModelProvider ( owner: this, new
ViewModelProvider.AndroidviewModelFactory(getApplication()).get(StudentViewModel.class)
//Livedata自动更新
studentViewModel.getAllStudentsLive () .observe ( owner: this,new Observer<List<Student>>()@overridepublic void onChanged (List<Student> students){adapter.setstudents ( students ) ;adapter.notifyDataSetChanged ( );});}public void mInsert (View view) {Student s1 = new student ( name: "Jack", age: 20) ;Student s2 = new Student ( name: "Rose", age: 18);studentviewModel .insertStudent (s1,s2) ;
}

room版本升级

1.构造Migration
static final Migration MIGRATION_1_2 = new Migration (1,2){@overridepublic void migrate (@NonNull SupportSQLiteDatabase database){database.execSQL ( "ALTERTABLE student ADD COLUMN sex INTEGER NOT NULLDEFAULT 1" );
};2.添加addMigrations
public static synchronized MyDatabase getInstance (Context context){if ( mInstance -= nul1){mInstance = Room. databaseBuilder(context.getapplicationContext(),    MyDatabase.class,DATABASE_NAME).addMigrations (MIGRATION_1_2,MIGRATION_2_3).build () ;
}
return mlnstance;
}3.修改注解
@Database (entities = {Student.class}, version = 2, exportSchema = false)

使用Migration升级数据库

问题:如果用户设备上数据库版本为1,而当前要安装的App数据库版本为3,怎么办?
Room会先判断当前有没有直接从1到3的升级方案,如果有,就直接执行从1到3的升级方案,如果没有,那么Room会按照顺序先后执行Migration(1,2)、Migration(2,3)以完成升级。

Android Jetpack架构组件之Room相关推荐

  1. Android Jetpack架构组件之 Room(使用、源码篇)

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发 ...

  2. android 使用4大组件的源码,Android Jetpack架构组件之 Paging(使用、源码篇)

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  3. android置组件下面,Android Jetpack架构组件(十二)之Hilt

    一. 依赖注入简介 依赖注入(英文Dependency Injection,简写DI)是一种被广泛使用的编程技术,主要的作用代码解耦. 借助依赖注入,我们可以轻松的管理类之间的依赖,并最终建立高可维护 ...

  4. Android Jetpack架构组件(一)带你了解Android Jetpack

    本文首发于微信公众号「后厂村码农」 前言 Android已经发展了11年,可以说是比较成熟的技术了,一开始时框架很少,也没有什么规范,所有的代码都是要自己写,比如网络请求,数据库请求,数据解析等等.后 ...

  5. Android Jetpack架构组件之Navigation

    Navigation 导航是指支持用户导航.进入和退出应用中不同内容片段的交互.Android Jetpack 的导航组件可帮助您实现导航,无论是简单的按钮点击,还是应用栏和抽屉式导航栏等更为复杂的模 ...

  6. Android Jetpack 架构组件之 Room

    一.Room简介 Room 持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制.该库可帮助您在运行应用的设备上创建应用 ...

  7. ios navigation的返回按钮长按_Android Jetpack架构组件 — Navigation入坑详解 [转]

    前言 这是最近看见的觉得比较有意思的文,希望对大家的学习有帮助. Navigation 直接翻译即为导航,它是 Android Jetpack 组件之一,让单 Activity 应用成为首选架构.应用 ...

  8. Android JetPack架构篇,一个实战项目带你学懂JetPack

    第五届世界互联网大会昨日开幕,来自76个国家的1500余位嘉宾出席大会.腾讯公司董事会主席兼首席执行官马化腾在大会开幕式演讲中表示,全球产业都在进行数字化,在此期间机遇挑战并存,产业互联网机会巨大. ...

  9. Android Jetpack导航组件——Navigation的使用

    概述 Navigation是采用一个Activity和多个Fragment形式设计的Ui架构模式,但是众所周知,Fragment的管理一直是个麻烦事,需要通过FragmentManager和Fragm ...

  10. Android 官方架构组件 Navigation 使用详解

    前言 前段时间,我在做项目开发的时候对Fragment的管理遇到几个小问题,总觉得在现阶段封装好的Fragment管理器不太优雅.这成为我下决心学习Jetpack在很早之前推出的Navigation库 ...

最新文章

  1. 构造代码块会想你所想
  2. ubuntu镜像下载地址(国内镜像源)
  3. Spring Cloud项目MVN编译 -- Non-resolvable import POM
  4. python 数组赋值_pythonamp;numpy的赋值
  5. 管理软件实施(5)——实施先了解下售前工作的特点(上)
  6. 使用Win Server 2012 R2的IIS创建FTP
  7. python数据分析的发展前景_Python+BI分析5000条招聘数据,原来数据分析工作在这儿最好找...
  8. css 百分比 怎么固定正方形_49 张 GIF 图中学习 49 个 CSS 知识点
  9. Linux中mongodb定时远程备份
  10. python实现完整的特征工程,实践论文中的分类模型和方法用于恶意页面的分类与识别
  11. 快速掌握用python写并行程序_自己python程序的并行修改
  12. Mocha: 58同城 App 基于卡片的线上 AB 测(线上卡片动态换)
  13. SoapUI测试webservice接口
  14. 机器学习与Web安全结合的基础
  15. Hbase的table存储详解
  16. php网页设计导航栏代码,总结7种常见的导航条制作实例
  17. 前台图片压缩转换base64提交到后台
  18. HTML5期末大作业:电影网站设计——我的电影(6页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  19. linux :Java SE Development Kit 7u5
  20. 植物大战僵尸针对关卡地址以及全部关数的内存基址详细步骤~包含如何观察地址情况等

热门文章

  1. 介绍Hosts文件和DNS及DNS的解析过程
  2. Java 抽奖活动循环编程练习
  3. 如何在线免费将caj转换Word格式
  4. 阿里云 EMAS Serverless 重磅发布
  5. 商品库存清单案例java_JAVA实现简单的商城库存清单
  6. Win7复制文件时出现:“您需要权限来执行操作!”(终极解决方法!)
  7. [SHOI2015]激光发生器
  8. Deepin-WPS输出PDF文件过大的终极解决办法
  9. 苏宁 OLAP 引擎发展之路
  10. 12306模拟登陆-超级鹰