Android使用room将数据保存到本地数据库,在使用room前首先要导入依赖包
implementation("androidx.room:room-runtime:2.4.2")z
annotationProcessor("androidx.room:room-compiler:2.4.2")
kapt("androidx.room:room-compiler:2.4.2")
implementation("androidx.room:room-ktx:2.4.2")
room包含三个主体:数据库类,用于保存数据库并作为应用持久性数据底层连接的主要访问点;数据实体,用于表示应用的数据库中的表;数据访问对象(dao),提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法。数据库类为应用提供与该数据库关联的 DAO 的实例。反过来,应用可以使用 DAO 从数据库中检索数据,作为关联的数据实体对象的实例。
首先定义一个数据实体(这里用一个相册的数据库来举例),数据实体类的每个属性就是一个实例,对于表中的一行
主键是数据实例的标号(等同于学校里学生的学号),可以通过这个主键来找到这个表 ,其余的相册名字、url、number、type就是该相册的数据实体,对应表格中的属性,这里的Album就是一个数据类,需加一个注解@Entity,这样一个room数据实体就构建完成
下一步需要定义该相册的DAO,需要通过接口类来实现
Room 提供了方便的注解,用于定义无需编写 SQL 语句即可执行简单插入、更新和删除的方法,只需在接口方法里添加注解(该方法的类型:insert、delete或update)
接着创建该表的数据库,需继承与RoomDatebase,同时这个类必须是抽象类abstract,需要添加注释@Database,括号里需要写入这个数据库用到了哪几张表entities、现在的版本号version、是否需要导出exportScheme。在数据库里面创建一个单例对象,数据库一定要提供单例对象,不然太耗费资源,这里加入一个锁synchronized,防止一个对象没创建完,在另一个地方同时创建,一次只能创建一个。
数据库里存储的是相册的名字,相册里的内容实际上是在文件里,所以我们要提供一个中间的reporsitory来操作数据库,同时需要创建一个暴露给外面的viewmodel对象,这其实就是一个mvvm数据结构
database、repositroy和viewmodel是通过context来连接的,所以需要传入一个context,这里让viewmodel继承与androidviewmodel是因为Androidviewmodel自身需要传入一个application,含有context,repositroy调用DAO里面的方法,viewmodel调用repositroy来实现mvvm,数据的调用肯定消耗时间,所以一般放在携程里面进行,在方法前加上suspend。