, 开发人员使用面向对象 API 与 数据库进行交互 , 比编写复杂的 SQL 语句操作数据库 要简单很多 ; ORM 框架常使用 元数据 将 数据库表 与 编程语言中的类 进行映射 , 数据库表字段...room_version" // 编译时依赖项 在编译时实时生成 Room 代码 如 : Dao 实现类 / AppDatabase 子类 / Entity 实体类映射器 annotationProcessor..., 在应用运行时提供 Room 框架的数据库相关核心功能 ; 该依赖库 包含了 Room 持久化库的核心功能 , 如 : RoomDatabase 类:用于表示数据库,可以包含一个或多个表,并提供了一些方法来操作数据库...Entity 注解:用于标记实体类,指定实体类对应的数据库表的名称和字段信息等。 Dao 数据库访问对象:用于定义访问数据库的方法,例如查询、插入和删除等操作。...需要使用如下注解修饰 使用 @Entity 注解修饰实体类 , 并指定 数据库表名 ; 使用 @PrimaryKey 注解修饰主键值 , 使用 @ColumnInfo 注解修饰 数据库表 列名 对应的字段
Room 有三个重要组件 Database Entity DAO Database 包含数据库持有者,并作为与应用持久关联数据的底层连接的主要接入点。...Entity 表示数据库中的表格 DAO 包含用户访问数据库的方法 这些组件以及组件与APP其他部分的关系 如图所示 ?...这个时候当然不希望数据库中的数据丢失。 Room 允许我们编写 Migration ,以此来迁移数据。每个迁移类制定一个开始版本和结束版本。...这样的话,如果不是测试数据库本身就不需要创建完整的数据库,这个功能是很好的,Dao不会泄露数据库的任何信息 在设备上测试 测试数据库实现的推荐方法是编写在Android设备上运行的JUnit测试,由于这些测试不需要创建活动...如果作者类引用另一个表(如Books),则应用程序的效率会进一步降低。 要使用Room同时引用多个实体,需要创建一个包含每个实体的POJO,然后编写一个查询来加入相应的表。
在Android App中进行本地数据的存储都是使用SQLite,当我们使用原生的SQLite进行本地数据库的编写时,我们不仅要定义数据库结构,还要创建SQLiteHelper,编写一连串的SQL语句。...对于Room的使用主要由三部分构成: Entity:标识数据库中的表结构 DAO: 标识提供获取数据库表中的数据方法 Database:标识所需要创建的数据库 以上三部分在代码中都是通过注释来实现,从而达到代码的精简...Entity Entity作用在model上,即我们与数据表中的字段所匹配的model类。...在Entity中可以通过使用tableName来为该表命名,这里将其命名未contacts。 除此之外,使用@ColumnInfo来标明表中的字段,@PrimaryKey来标明表的主键。...使用 经过上面的Entity、DAO与Database的创建,现在我们已经有了完整的本地数据库结构。
Room是Google官方推荐使用的数据库,相比较某些优秀数据库框架来说,不用过于担心某天库会停止维护,且访问数据库非常流畅,并且提供了与常规的ORM框架一样,通过添加编译期注解来进行表和字段的配置,譬如...总而言之, Room功能强大,速度和稳定性不弱,还简单易用,算得上是一个优秀的数据库。 这里总结下使用room数据库的过程和遇到的问题,以及如何稳定的进行数据库的迁移和升级。...自增类型的主键,则可以设置 @PrimaryKey 的 autoGenerate 属性。 忽略字段: 使用@Ignore注解,如,@Ignore val picture: Bitmap?...package com.xxx.xx.room.entity import android.arch.persistence.room.Entity import android.arch.persistence.room.PrimaryKey...当修改表字段或者增加表结构时,数据库升级注意事项: 无论是增加新表还是只是修改表字段或增加表字段,都需要增加下数据库的版本号并增加Migration处理, @Database(entities = [User
首语 Android使用SQLite作为数据库存储数据,但是SQLite使用繁琐且容易出错,有许多开源的数据如GreenDAO、ORMLite等,这些都是为了方便SQLite的使用而出现的,Google...Entity:表示数据库中的表。 DAO:包含用于访问数据库的方法。 应用使用 Room 数据库来获取与该数据库关联的数据访问对象 (DAO)。...每个Entity至少有一个字段作为主键,如果想让数据库为字段自动分配ID,可以使用autoGenerate,如果Entity想有符合主键,可以使用@Entity注解里的primaryKeys,设置复合主键...Room通过@Ignore设置忽略字段,如果Entity继承了父Entity的字段,可以通过@Entity注解里的ignoredColumns属性设置。...在 Room 2.1.0 以上版本中,基于 Java 的不可变值类(使用 @AutoValue 进行注释)用作应用数据库中的Entity。
在运行时,您可以通过调用Room.databaseBuilder()或Room.inMemoryDatabaseBuilder()获取数据库实例。 Entity: 表示数据库内的表。...如果你的entity有一个组合主键,你可以使用@Entity注解的primaryKeys属性。 2.tableName Room默认把类名作为数据库的表名。...如果你想用其它的名称,使用@Entity注解的tableName属性。 3.ColumnInfo Room默认把field名称作为数据库表的column名。...要为一个entity添加索引,在@Entity注解中添加indices属性,列出你想放在索引或者组合索引中的字段。 有时候,某个字段或者几个字段必须是唯一的。...这种情况下,你可以使用@Embedded注解,表示你想把一个对象分解为表的子字段。然后你就可以像其它独立字段那样查询这些嵌入的字段。
2、在插入记录之时,必须将数据实例的属性值逐一赋给该表的各字段; 3、在查询记录之时,必须遍历结果集游标,把各字段值逐一赋给数据实例; 4、每次读写操作之前,都要先开启数据库连接;读写操作之后,...,还要编写若干对应的代码文件。...以录入书籍信息为例,此时要对书籍信息表进行增删改查,则具体的编码过程分为下列五个步骤: 一、编写书籍信息表对应的实体类 假设书籍信息类名叫BookInfo,且它的各属性与书籍信息表的各字段一一对应,那么要给该类添加...“@Entity”注解,表示该类是Room专用的数据类型,对应的表名称也叫BookInfo。...下面是BookInfo类的定义代码例子: @Entity public class BookInfo { @PrimaryKey // 该字段是主键,不能重复 @NonNull // 主键必须是非空字段
一、销毁 和 重建策略 在 Android 中使用 Room 操作 SQLite 数据库 , 如果 SQLite 数据库表 修改比较繁琐 , 如 : 涉及到 修改 数据库表字段的数据类型 , 需要逐个修改数据库值...数据库 版本 2 和 3 分别在 数据库 版本 1 的基础上新增了一个字段 ; 这里要升级的数据库版本 4 , 要 在 数据库版本 3 的基础上 , 将 integer 类型的字段 sex 的 数据类型...= true) abstract class StudentDatabase: RoomDatabase() { 4、修改实体类数据类型 将 Entity 实体类 Student 类中的 sex 字段...Entity 实体 / 同时定义数据库表 和 对鹰的实体类 * 设置该数据类对应数据库中的一张数据表, 表名为 student * 该数据库表中的数据对应一个 Student 类实例对象 */...Entity 实体 / 同时定义数据库表 和 对鹰的实体类 * 设置该数据类对应数据库中的一张数据表, 表名为 student * 该数据库表中的数据对应一个 Student 类实例对象 */
Room 简介 Room 持久化库提供了一个基于 SQLite 的抽象层,以便在利用 SQLite 的全部功能的同时实现更强大的数据库访问 Room 库帮你的 App 在设备上创建一个缓存,并作为此 App...在运行时,你可以通过调用 Room.databaseBuilder()或 Room.inMemoryDatabaseBuilder()来获取 Database 实例 Entity 数据库中的表...DAO 包含用于访问数据库的方法 该应用程序使用 Room 数据库来获取与该数据库关联的数据访问对象或 DAO。...只有一个参数,并被 @PrimaryKey 注释作为主键,此处 @ColumnInfo 的作用是给此参数取一个别名 c_word ,该别名会被真实的记录于数据库的字段中,如果在同一张表中存在多个可能重复的字段时例如...true) val id: Int, val word: String) 关于 Entity 详细解释见 Entity DOC DAO 为了避免 UI 阻塞,一些比较耗时的操作如
@Ignore 用于告诉Room需要忽略的字段或方法 建立索引:在@Entity注解的indices属性中添加索引字段。...创建数据库 Room中DataBase类似SQLite API中SQLiteOpenHelper,是提供DB操作的切入点,但是除了持有DB外, 它还负责持有相关数据表(Entity)的数据访问对象(DAO...), 所以Room中定义Database需要满足三个条件: 继承RoomDataBase,并且是一个抽象类 用@Database 注解,并定义相关的entity对象, 当然还有必不可少的数据库版本信息...3.2 原有SQLite数据库迁移至Room 因为Room使用的也是SQLite, 所以可以很好的支持原有Sqlite数据库迁移到Room。...假设原有一个版本号为1的数据库有一张表User, 现在要迁移到Room, 我们需要定义好Entity, DAO, Database, 然后创建Database时添加一个空实现的Migraton即可。
一、Schema 文件简介 使用 Room Migration 升级数据库 , 需要根据当前数据库版本和目标版本编写一系列 Migration 迁移类 , 并生成一个升级的 Schema 文件 , 该文件是...; Schema 文件是 描述 Room 数据库结构的文件 , 通过该文件 , 可以 很方便地开发者了解数据库的历史变更记录 , 方便排查问题 ; Schema 文件 定义了数据库中的表、列、索引等元素的结构....build() } } return instance; } 将 Entity 实体类中 新增的字段 注释掉...Entity 实体类中的字段 , 在 数据库版本 1 的基础上 , 添加 sex 字段 ; /** * 性别字段 * 数据库表中的列名为 sex * 数据库表中的类型为...Entity 实体类中的字段 , 在 数据库版本 2 的基础上 , 添加 degree 字段 ; /** * 性别字段 * 数据库表中的列名为 sex * 数据库表中的类型为
一、Room#Migration 迁移工具简介 1、Room 中的迁移工具 Migration 简介 使用 Room 访问数据库时 , 应用程序 的 数据模型 发生 改变 , 数据库版本进行升级 , 数据库表的字段...2、Migration 迁移工具使用步骤 在 Room 中使用 Migration 迁移工具 升级数据库步骤 : 更新数据模型 : 如果要 更改数据库的结构 , 更新 Entity 实体类 , 修改实体类就是修改数据库表结构...组合方式 | 代码示例 ) 博客的代码示例基础上 , 为 student 数据库表 , 新增 性别 sex 字段 ; 1、修改 Entity 实体类 - 更改数据模型 首先 , 要在 Entity 实体类中加入新的数据库字段...实体类修改后的完整代码 Entity 实体类中加入新的数据库字段 sex 字段 ; 完整代码 : package kim.hsl.rvl import androidx.room.ColumnInfo...Entity 实体 / 同时定义数据库表 和 对鹰的实体类 * 设置该数据类对应数据库中的一张数据表, 表名为 student * 该数据库表中的数据对应一个 Student 类实例对象 */
:room-compiler:2.2.5' 2、定义 Entity 实体类 使用 Room 框架 的应用中 , Entity 实体类 对应着 数据库表 , 将 Entity 实体类 定义完成后 , 就意味着...数据库表的结构 已经定义完成 ; @Entity 注解 Entity 实体类 需要使用 @Entity 注解进行修饰 , 该注解可以 传入 tableName 参数 , 该 tableName 参数的作用是定义数据库表的名称...类型 ; /** * 姓名字段 * 数据库表中的列名为 name * 数据库表中的类型为 TEXT 文本类型 */ @ColumnInfo(name...import androidx.room.Ignore import androidx.room.PrimaryKey /** * 定义数据库表 Entity 实体 / 同时定义数据库表 和 对鹰的实体类...* 设置该数据类对应数据库中的一张数据表, 表名为 student * 该数据库表中的数据对应一个 Student 类实例对象 */ @Entity(tableName = "student")
定义数据表中的字段名 用于告诉Room需要忽略的字段或方法 建立索引:在 注解的 属性中添加索引字段。...创建数据库 Room中DataBase类似SQLite API中SQLiteOpenHelper,是提供DB操作的切入点,但是除了持有DB外, 它还负责持有相关数据表(Entity)的数据访问对象(DAO...), 所以Room中定义Database需要满足三个条件: 继承RoomDataBase,并且是一个抽象类 用@Database 注解,并定义相关的entity对象, 当然还有必不可少的数据库版本信息...假设原有一个版本号为1的数据库有一张表User, 现在要迁移到Room, 我们需要定义好Entity, DAO, Database, 然后创建Database时添加一个空实现的Migraton即可。...五、总结 在SQLite API方式实现数据持久化的项目中,相信都有一个任务繁重的 实现, 一堆维护表的字段的 类, 一堆代码类似的数据库访问类(DAO),访问数据库时需要做Cursor的遍历,构建并返回对应的
Room有3个主要组件 Database :数据库 Entity : 代表数据库一个表结构 Dao : 包含访问数据库的方法 简单使用 添加Google Maven仓库 allprojects {...private String name; @ColumnInfo(name = "sex") private int sex; @Ignore//指示Room需要忽略的字段或方法..., "database_name") .build(); 生成数据库实例的其他操作 Room.databaseBuilder(getApplicationContext(),...Java对象(POJO)作为数据库逻辑中的一个完整的整体来表示,即使该对象包含几个字段。..., street , state , city , 和 post_code 注意 :嵌入式字段还可以包含其他嵌入式字段 如果一个实体具有相同类型的多个内嵌字段,则可以通过设置前缀属性(prefix)使每个列保持惟一
数据控制语言DCL 数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制 数据库操纵事务发生的时间及效果,对数据库实行监视等。如: 1) GRANT:授权。...面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。...字段类型要一致。关于Java类型和SQL的数据库表映射规则,请查阅官网。...dao层需要和数据库交互,则必须要一个entity来存储数据,于是需要先新建一个entity。...之前的测试全都是针对真实数据库的。在后面我们会引入自动化测试,自动化测试会跑无数遍,肯定不能用真实的数据库来测试代码逻辑的准确。因此,引入h2. h2是一个内存数据库,Java编写的。
下面是Room的架构图: 要想更好地理解上面的图,我们先要理解几个概念:Entity和Dao Entity:实体,一个entity就对应于数据库中的一张表。...Entity类是Sqlite中的表对java类的映射,例如有一个学生表,有id,name,age三个字段;那么对应的就有一个学生类,有id,name,age三个成员变量和学生表中的字段进行一一对应。 ...就是建立一个从数据库表到java类的映射,表中的字段对应类中的成员变量,表中的记录对应该类的一个实例。...二.Room数据库的基本使用方法 1.在使用Room数据库前,先要在app/build.gradle文件中导入以下的依赖: implementation 'androidx.room:room-runtime...注解用于将Student类和Room数据库中的数据表对应起来;@PrimaryKey注解即主键约束;@ColumnInfo注解可以设置该成员变量对应的表中字段的名称以及类型 需要注意的一点是get方法不可省略
设计一个关系型数据库很重要的一部分是将数据拆分成具有相关关系的数据表,然后将数据以符合这种关系的逻辑方式整合到一起。...ownerId: Long ) associative: en.wikipedia.org/wiki/Associ… 如果现在我们想要获取到所有的狗狗和主人的数据,也就是 List,仅需要编写两个...: List 更高阶的数据库关系用例 当使用 @Relation 注解时,Room 会默认从所修饰的属性类型推断出要使用的数据库实体。...如果您想让该查询返回一个不同的类,比如 Pup 这样不是一个数据库实体但是包含了一些字段的对象。...,而不管您所创建的是什么,您可以通过在字段中使用 ForeignKey 来做到。
的一部分 , 它是一个方便的 数据库迁移工具 , 用于为 Android 中使用 Room 框架创建的数据库 提供 自动化迁移方案 ; Room Migration 数据库迁移工具用途如下 : 数据库修改...: 修改数据库表结构 ; 迁移代码 : 为每个数据库版本编写 迁移代码 ; 自动更新 : 执行应用时 自动 检测数据库版本号 并 自动进行数据迁移 ; 迁移前保存数据库数据 : 当在应用程序中更改 Room...数据库 保持最新架构 ; 二、多个数据库版本的迁移 在原始 版本 1 的数据库中 , 有如下 : id , name , age , 三个字段 ; @Entity(tableName = "student...= ColumnInfo.TEXT) lateinit var name: String /** * 年龄字段 * 数据库表中的列名为 age * 数据库表中的类型为...】使用 Room 中的 Migration 升级数据库 ( 修改 Entity 实体类 - 更改数据模型 | 创建 Migration 迁移类 | 修改数据库版本 | 代码示例 ) 中 , 讲解了如何使用
】Room 中的销毁重建策略 ( 创建临时数据库表 | 拷贝数据库表数据 | 删除旧表 | 临时数据库表重命名 ) 博客 中的 版本 1 数据库表结构对应的 Entity 实体类代码 , @Entity...age 字段的 非空属性不同 , 这里 在 DB Browser for SQLite 工具中设置 age 字段为非空字段 ; 右键点击数据库表 , 在弹出的右键菜单中 , 选择 " 修改表 " 选项...name , age 三个字段 ; package kim.hsl.rvl import androidx.room.ColumnInfo import androidx.room.Entity import...androidx.room.Ignore import androidx.room.PrimaryKey /** * 定义数据库表 Entity 实体 / 同时定义数据库表 和 对鹰的实体类 *...设置该数据类对应数据库中的一张数据表, 表名为 student * 该数据库表中的数据对应一个 Student 类实例对象 */ @Entity(tableName = "student") class
领取专属 10元无门槛券
手把手带您无忧上云