相关文章推荐
瘦瘦的野马  ·  SQL ...·  1 周前    · 
安静的皮蛋  ·  Visual ...·  1 周前    · 
酷酷的金鱼  ·  ASP.NET Core 实战-7.使用 ...·  1 周前    · 
谦和的柳树  ·  json数组对象key相同 - ...·  1 年前    · 
小胡子的煎饼  ·  Android ...·  1 年前    · 
酒量小的红薯  ·  Python os.system: ...·  1 年前    · 

视图是一个或者多个基本表(视图)构建的一个虚拟表,使用视图有许多的好处,其中主要的两个好处是封装查询和灵活的安全性控制。Room 从2.1.0 及更高版本开始支持 SQLite 数据库视图功能,你可以将查询封装到一个类中, Room 将这些支持查询的类称之为视图,视图在 DAO 中使用跟普通的数据实体对象一样。更多关于视图的相关内容大家可以自行学习,在本篇幅,我们将详细介绍在 Room 中创建视图并使用。

注意事项:跟数据实体类一样,你可以在视图中执行 SELECT 查询语句,但是你无法在视图中执行 INSERT UPDATE DELETE 语句。换句话说,视图只有读权限,没有写权限,这就是安全性控制的一个特点。

二、 在Room中使用视图

2.1 创建视图类

Room 创建视图非常简单,定义一个数据类(跟数据实体类一样,不过对应的是视图,不是实体表),使用 @DatabaseView 注解进行标注, @DatabaseView 有两个参数,一个是 viewName (自定义视图名称,可选),另一个是 values (视图数据对应的 SQL 查询语句)。如下示例所示:

// 数据实体类(实体表),视图类对应数据实体类(实体表)
@Entity(tableName = "schools")
data class School(@PrimaryKey val sid: Int, val name: String, val addr: String)
@Entity(tableName = "students")
data class Student(@PrimaryKey val sid: Int, val name: String, val age: Int, val schoolId: Int, val addr: String?)
// 创建视图类,@DatabaseView 注解可以用 viewName 参数指定视图名称,如果不指定视图名称,@DatabaseView 注解默认参数是 value
//@DatabaseView(viewName = "student_school", value = "SELECT students.sid, students.name, students.age, " +
//        "schools.sid AS schoolId, schools.name AS schoolName " +
//        "FROM students INNER JOIN schools ON students.schoolId = schools.sid")
@DatabaseView("SELECT students.sid, students.name, students.age, " +
        "schools.sid AS schoolId, schools.name AS schoolName " +
        "FROM students INNER JOIN schools ON students.schoolId = schools.sid")
data class StudentWithSchool(
    val sid: Int, 
    val name: String, 
    val age: Int, 
    val schoolId: Int, 
    val schoolName: String)

2.2 在数据库类中声明视图

    创建了视图类之后,需要在数据库定义时声明视图类。在 @Database 注解中的 views 参数进行声明,如下示例所示:

@Database(
entities = [User::class, School::class, Student::class, Profile::class], 
views = [StudentWithSchool::class], 
version = 1)
abstract class AppDatabase: RoomDatabase() {
    abstract fun studentDao(): StudentDao

2.3 查询视图获取数据

    在 DAO 类中添加查询视图方法,即可从视图中查询数据。

interface StudentDao { @Insert fun insertAll(vararg student: Student) @Insert fun insertSchool(vararg schools: School) // 查询视图表 @Query("SELECT * from StudentWithSchool") suspend fun getStudentWithSchool() : List<StudentWithSchool>

注意事项:视图表只能执行 SELECT 查询操作,不能执行 INSERTUPDATEDELETE 操作。

2.4 数据库迁移时视图的处理

    视图是一个虚拟表,所以在数据库升级迁移时,视图发生变更(新增、删除、修改等)时,也需要进行处理。数据库迁移相关可请参考文章:Android Room 数据库详解。下面通过示例介绍下数据库迁移时视图的处理。

  • 数据库迁移前
// 定义数据库
@Database(entities = [User::class, School::class, Student::class, Profile::class], version = 1)
abstract class AppDatabase: RoomDatabase() {
    abstract fun studentDao(): StudentDao
// 构建数据库类
val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "app.db")
    .build()
  • 数据库迁移后(新增视图)
// 定义数据库
@Database(entities = [User::class, School::class, Student::class, Profile::class], views = [StudentWithSchool::class], version = 2)
abstract class AppDatabase: RoomDatabase() {
    abstract fun studentDao(): StudentDao
// 定义数据库迁移配置
val migration_1_2 = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        // 这里新建一个视图(视图名称要用两个半角的间隔号括起来)
        database.execSQL("CREATE VIEW `StudentWithSchool` AS SELECT students.sid, students.name, students.age, schools.sid AS schoolId, schools.name AS schoolName FROM students INNER JOIN schools ON students.schoolId = schools.sid")
// 构建数据库类
val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "app.db")
    .addMigrations(migration_1_2) // 添加数据迁移配置
    .build()
 

示例讲解:上面的示例中,数据库迁移过程中新增一个视图,在迁移配置中必须手动创建一个视图。跟数据表一样,在 @Database 中声明的视图类,只会在第一次安装创建数据库时才会创建视图,后续添加的必须进行数据库迁移操作。创建视图使用 CREATE VIEW 语法(更多 SQL 语法大家自行学习),不过笔者发现一个很有趣的现象,SQL 语句创建视图时,视图名称直接用字符窜表示即可,但是在 Room 的数据库迁移配置中,必须使用两个半角的间隔号(就是键盘上方 1 数字键左边的那个按键,并不是单引号,这个需要特别注意)。

是一个持久性库,属于 Android的一部分。Room数据库之上的一个抽象层。SQLite 使用一种专门的语言 (SQL) 来执行数据库操作。Room 并不直接使用 SQLite,而是负责简化数据库设置和配置以及与数据库交互方面的琐碎工作。此外,Room 还提供 SQLite 语句的编译时检查。 文章目录1. 为什么要使用 Room?2. 通过一个案例,介绍如何使用 Room2.1 数据库 ER 图2.2 添加 Room 的依赖2.3 创建实体2.4 创建 Dao2.5 创建数据库2.6 封装 Repository2.7 类型转换器@TypeConverter2.8 数据库迁移 Migration2.9 数据库的测试3. 分析 Room 的组成及使用原理4. 总结一下 Room 的使用参考... 安卓jetpack 的room数据库框架是基于Sqlite3的数据库,但是有别于sqlite,因此使用查看sqlite的数据库可视化软件看不到room数据库的值(但是可以打开), 使用Androidstudio自带的databaseinspector,高版本的AS需要在APP inspection里面打开,另外应用必须是debug版本 版权声明:本文为博主原创文章,欢迎大家转载! 但是转载请标明出处: https://blog.csdn.net/t000818/article/details/84289212 ,本文出自:【唐宏宇的博客】 在Room persistence library 的2.1.0及更高版本提供了对SQLite数据库视图的支持,允许将查询封装到类Room将这些查询支持的类称为视图,使用它们时和D... 一: 使用 Room 将数据保存到本地数据库 注:本文摘自安卓开发文档,仅供学习使用,链接如下:安卓开发文档ROOM Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。 处理大量结构化数据的应用可极大地受益于在本地保留这些数据。最常见的用例是缓存相关数据。这样,当设备无法访问网络时,用户仍可在离线状态下浏览相应内容。设备之后重新连接到网络后,用户发起的所有内容更改都会同步到服务器。 *注意:要在应用使用 Room,请在应用的 build. 一.Room简介 Room是Google推出的数据库框架,是一个 ORM (Object Relational Mapping)对象关系映射数据库、其底层还是对SQLite的封装。 使用ORM可以让开发者更加关注业务逻辑,而不是SQL 语句。在JavaWeb领域也有类似的ORM 数据库框架Hibernate、MyBatis等等。 1.Android平台数据库框架 在 Android 常见的数据库框架: Greendao Realm DBFlow LitePal Jetpack-Room 翻译至:Android Room with a View - Java 架构组件的目的是提供对应用程序体系结构的指导,并为诸如生命周期管理和数据持久化等常见任务提供开发库。 架构组件帮你构造一个鲁棒、易测试、可维护和少模板代码的应用。 架构组件是什么? 为了介绍相关术语,这里有简短的介绍一下各架构组件以及它们之前如...