Android Jetpack架构组件之Room
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相关推荐
- Android Jetpack架构组件之 Room(使用、源码篇)
2019独角兽企业重金招聘Python工程师标准>>> 1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发 ...
- android 使用4大组件的源码,Android Jetpack架构组件之 Paging(使用、源码篇)
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- android置组件下面,Android Jetpack架构组件(十二)之Hilt
一. 依赖注入简介 依赖注入(英文Dependency Injection,简写DI)是一种被广泛使用的编程技术,主要的作用代码解耦. 借助依赖注入,我们可以轻松的管理类之间的依赖,并最终建立高可维护 ...
- Android Jetpack架构组件(一)带你了解Android Jetpack
本文首发于微信公众号「后厂村码农」 前言 Android已经发展了11年,可以说是比较成熟的技术了,一开始时框架很少,也没有什么规范,所有的代码都是要自己写,比如网络请求,数据库请求,数据解析等等.后 ...
- Android Jetpack架构组件之Navigation
Navigation 导航是指支持用户导航.进入和退出应用中不同内容片段的交互.Android Jetpack 的导航组件可帮助您实现导航,无论是简单的按钮点击,还是应用栏和抽屉式导航栏等更为复杂的模 ...
- Android Jetpack 架构组件之 Room
一.Room简介 Room 持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制.该库可帮助您在运行应用的设备上创建应用 ...
- ios navigation的返回按钮长按_Android Jetpack架构组件 — Navigation入坑详解 [转]
前言 这是最近看见的觉得比较有意思的文,希望对大家的学习有帮助. Navigation 直接翻译即为导航,它是 Android Jetpack 组件之一,让单 Activity 应用成为首选架构.应用 ...
- Android JetPack架构篇,一个实战项目带你学懂JetPack
第五届世界互联网大会昨日开幕,来自76个国家的1500余位嘉宾出席大会.腾讯公司董事会主席兼首席执行官马化腾在大会开幕式演讲中表示,全球产业都在进行数字化,在此期间机遇挑战并存,产业互联网机会巨大. ...
- Android Jetpack导航组件——Navigation的使用
概述 Navigation是采用一个Activity和多个Fragment形式设计的Ui架构模式,但是众所周知,Fragment的管理一直是个麻烦事,需要通过FragmentManager和Fragm ...
- Android 官方架构组件 Navigation 使用详解
前言 前段时间,我在做项目开发的时候对Fragment的管理遇到几个小问题,总觉得在现阶段封装好的Fragment管理器不太优雅.这成为我下决心学习Jetpack在很早之前推出的Navigation库 ...
最新文章
- 构造代码块会想你所想
- ubuntu镜像下载地址(国内镜像源)
- Spring Cloud项目MVN编译 -- Non-resolvable import POM
- python 数组赋值_pythonamp;numpy的赋值
- 管理软件实施(5)——实施先了解下售前工作的特点(上)
- 使用Win Server 2012 R2的IIS创建FTP
- python数据分析的发展前景_Python+BI分析5000条招聘数据,原来数据分析工作在这儿最好找...
- css 百分比 怎么固定正方形_49 张 GIF 图中学习 49 个 CSS 知识点
- Linux中mongodb定时远程备份
- python实现完整的特征工程,实践论文中的分类模型和方法用于恶意页面的分类与识别
- 快速掌握用python写并行程序_自己python程序的并行修改
- Mocha: 58同城 App 基于卡片的线上 AB 测(线上卡片动态换)
- SoapUI测试webservice接口
- 机器学习与Web安全结合的基础
- Hbase的table存储详解
- php网页设计导航栏代码,总结7种常见的导航条制作实例
- 前台图片压缩转换base64提交到后台
- HTML5期末大作业:电影网站设计——我的电影(6页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
- linux :Java SE Development Kit 7u5
- 植物大战僵尸针对关卡地址以及全部关数的内存基址详细步骤~包含如何观察地址情况等