Android Jetpack组件化之ORM 数据库访问框架详解

news2024/11/23 19:13:45

一、对象关系映射 - ORM / Object Relational Mapping


Android 系统中使用的数据库是 SQLite 关系型数据库 , 使用 Android 提供的 api 访问 SQLite 数据库非常繁琐 , 由此出现了很多 ORM 框架 ;

ORM 英文全称 Object Relational Mapping , 对象关系映射 ;

对象关系映射 ORM 是一种编程技术 , 面向对象编程语言 与 关系型数据库 之间的 映射 ;

  • 对象 指的是 面向对象编程语言 ,
  • 关系 指的是 关系型数据库 ;

借助 ORM 对象关系映射 框架 访问数据库 , 可以 简化数据库操作流程 , 开发人员使用面向对象 API 与 数据库进行交互 , 比编写复杂的 SQL 语句操作数据库 要简单很多 ;

ORM 框架常使用 元数据 将 数据库表 与 编程语言中的类 进行映射 , 数据库表字段 与 类中的字段 一一对应 , 常用的元数据有 :

  • 注解
  • 配置文件

ORM 框架优点 :

  • 提高了开发效率 : 使用 ORM 操作数据库 简化了数据库操作过程 , 令代码更容易开发维护 ;
  • 提高了可移植性 : 使用 ORM 框架操作数据库 , 可以在 不改变代码的前提下 , 更换底层数据库 ;
  • 提高了性能 : 可以 总体优化 ORM 框架的 增删查改 操作性能 ;
  • 提高了安全性 : 可避免直接使用 SQL 语句查询时 , 产生的 SQL 注入攻击 ;

常见的 ORM 框架 :

  • Android 平台 : GreenDao / ORMLite ;
  • JavaEE 平台 : Hibernate ;
  • .NET 平台 : Entity Framework ;
  • Python 平台 : DiangoORM ;

在 Android 中 , Google 官方提供了一个基于 SQLite 关系型数据库操作封装的 ORM 框架 , Room 框架 ;

二、Room 框架的组成部分


1、@Entity / @Dao / @Database 注解

Room 框架中的重要注解 :

  • @Entity 注解 : 用于修饰 JavaBean 实体类 , 对应数据库中的一张表结构 ;

  • @Dao 注解 : 用于修饰 数据库访问对象 类 , 其中定义了 数据库的 增删改查 函数 ;

  • @Database 注解 :

    修饰 数据库持有者 , 数据库持有者 就是 数据库链接对象 , 是 应用持久化数据底层连接的接入点 ;

    • 使用 @Database 注解 修饰的类 , 该类必须继承 RoomDatabase 抽象类 ;
    • 在该注解中 , 需要定义 数据库 相关的 实体类 列表 ;
    • 数据库持有者 包含 没有参数的抽象方法 , 该方法返回 Dao 对象 ;

2、Entity 实体类 / Dao 数据库访问对象 / Database 数据库持有者 之间的关系

Database 数据库持有者 , Dao ( Data Access Objects ) 数据库访问对象 , Entity 实体类 , 三者之间的关系如下 :

  • 首先 , 在 Android 应用中 , 通过 Room 框架的 Database 拿到 数据库持有者 对象 ;
  • 然后 , 通过 数据库持有者 Database 拿到 Dao ( Data Access Objects ) 数据库访问对象 ;
  • 最后 , 通过 Dao ( Data Access Objects ) 数据库访问对象 访问 数据库中每个表对应的 Entity 实体类对象 ;

在这里插入图片描述

三、Room 框架使用步骤


Room 框架使用步骤 :

  • 添加 Room 框架依赖
  • 创建 Entity 实体类
  • 创建 Dao 实体类
  • 创建 RoomDatabase 数据库实例对象
  • 初始化 Room 数据库
  • 调用 Dao 执行数据库增删改查操作

1、添加 Room 框架依赖

在 Module 模块下的 build.gradle 构建脚本 中 , 配置如下依赖项 :

dependencies {
	// 配置 Room 框架版本号
    def room_version = "2.4.0"
	
	// 核心运行时依赖库 在应用运行时提供 Room 框架的数据库相关核心功能
    implementation "androidx.room:room-runtime:$room_version"
    // 编译时依赖项 在编译时实时生成 Room 代码 如 : Dao 实现类 / AppDatabase 子类 / Entity 实体类映射器
    annotationProcessor "androidx.room:room-compiler:$room_version"

    // 可选配置项 - 支持 Kotlin 扩展和协程的 Room 框架 如果使用的是 Kotlin 语言必须导入该依赖
    implementation "androidx.room:room-ktx:$room_version"
}

androidx.room:room-runtime 依赖库 是 运行时核心依赖库 , 在应用运行时提供 Room 框架的数据库相关核心功能 ; 该依赖库 包含了 Room 持久化库的核心功能 , 如 :

  • RoomDatabase 类:用于表示数据库,可以包含一个或多个表,并提供了一些方法来操作数据库,例如插入、删除和查询数据等。
  • Entity 注解:用于标记实体类,指定实体类对应的数据库表的名称和字段信息等。
  • Dao 数据库访问对象:用于定义访问数据库的方法,例如查询、插入和删除等操作。
  • Query 注解:用于标记 DAO 接口中的方法,并指定 SQL 查询语句。
  • PrimaryKey 注解:用于指定实体类中的主键字段。
  • TypeConverters 注解:用于标记类型转换器类,将特定类型的数据转换为数据库中的原生类型。

androidx.room:room-compiler 依赖库 是 Room 持久化库中的一个 编译时依赖项 , 用于 在编译时生成 Room 的如下实现代码 :

  • AppDatabase 的子类 , 用于创建和访问数据库 ;
  • Dao 数据库访问对象实现类 , 用于执行 SQL 查询和操作 ;
  • 实体类 Entity 的映射器 , 用于将数据库中的数据映射到实体类中 ;

androidx.room:room-ktx 依赖库 , 提供了 Kotlin 扩展功能 , 如果使用的是 Kotlin 语言 , 则必须导入该依赖库 ;

2、创建 Entity 实体类

创建 Entity 实体类 , 该实体类对应着数据库中的一张表 , 需要使用如下注解修饰

  • 使用 @Entity 注解修饰实体类 , 并指定 数据库表名 ;
  • 使用 @PrimaryKey 注解修饰主键值 ,
  • 使用 @ColumnInfo 注解修饰 数据库表 列名 对应的字段 ;
@Entity(tableName = "users")
data class User(
    @PrimaryKey val id: Int,
    @ColumnInfo(name = "name") val name: String,
    @ColumnInfo(name = "age") val age: Int
)

3、创建 Dao 实体类

创建 Dao 实体类 : 创建用于访问数据库的 DAO 接口 , 并使用注解指定 SQL 查询语句等信息 ;

  • 使用 @Dao 注解修饰整个 Dao 实体类 ;
  • 使用 @Query 注解修饰查询函数 ;
  • 使用 @Insert 注解修饰插入函数 ;
  • 使用 @Delete 注解修饰删除函数 ;
@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    fun getAll(): List<User>

    @Insert
    fun insert(user: User)

    @Delete
    fun delete(user: User)
}

4、创建 RoomDatabase 数据库实例对象

创建 RoomDatabase 数据库实例对象 : 创建 RoomDatabase 的子类实例对象 , 并定义抽象方法以获取 DAO 实例 ;

@Database(entities = arrayOf(User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

5、初始化 Room 数据库

初始化数据库 : 在应用程序中使用 Room 数据库之前 , 必须先创建数据库实例 ;

val db = Room.databaseBuilder(
    applicationContext,
    AppDatabase::class.java, "database-name"
).build()

6、调用 Dao 执行数据库增删改查操作

调用 Dao 执行数据库增删改查操作 :

db.userDao().insert(User(1, "John", 25))
val users = db.userDao().getAll()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/500076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“智能指针:C++中优雅的内存管理解决方案“

前言 欢迎来到&#x1f496;小K&#x1f496;的&#x1f49e;C专栏&#x1f49e;&#xff0c;内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况&#xff0c;这是C和C程序员的噩梦之一。本节将为大家带来解决办法—>智能指针 文章目录 前言1、简介2、为什么…

【移动端网页布局】flex 弹性布局 ⑤ ( 设置侧轴单行子元素排列方式 | align-items 样式说明 | 代码示例 )

文章目录 一、设置子元素是否换行 : align-items 样式说明1、 align-items 样式引入2、 align-items 样式属性值 二、代码示例1、 代码示例 - 默认样式2、 代码示例 - 设置主轴水平居中3、 代码示例 - 设置侧轴垂直居中4、 代码示例 - 设置侧轴从下到上排列5、 代码示例 - 设置…

C++之类和对象(二)

目录 前言 类的6个默认成员函数 1.构造函数 1.1 概念 1.2 特性 2. 析构函数 2.1 概念 2.2 特性 3. 拷贝构造函数 3.1 概念 3.2 特征 4.赋值运算符重载 4.1 运算符重载 4.2.赋值运算符重载 4.3 前置和后置重载 5. .const成员 6.取地址及const取地址操作符重载 前…

【二叉搜索树】

1 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树 &#xff0c;或者是具有以下性质的二叉树 : 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值 它的左…

Android“真正的”模块化

作者&#xff1a;bytebeats 模块化背后的原则概述 “如果说SOLID原则告诉我们如何将砖块排列成墙和房间, 那么组件原则则告诉我们如何将房间排列成建筑.” ~ Robert C. Martin, Clean Architecture 你应该分层打包还是分特性打包?还有其他方法吗? 如何提高项目的编译时间? 你…

将Python环境迁移到另一台设备上

本方法可以将一台电脑上的python环境迁移到另一台电脑上&#xff0c;可以省去一个一个包pip的麻烦。本文以pytorch的迁移为例。 一、从源环境备份安装包 在原来的电脑的Conda控制台中使用语句 pip freeze > c:\myrequirement.txt 后面跟的参数是文件的路径和文件名&#x…

Spring MVC自定义拦截器--Spring MVC异常处理

目录 自定义拦截器 什么是拦截器 ● 说明 自定义拦截器执行流程分析图 ● 自定义拦截器执行流程说明 自定义拦截器应用实例 ● 应用实例需求 创建MyInterceptor01 创建FurnHandler类 在 springDispatcherServlet-servlet.xml 配置拦截器 第一种配置方式 第二种配置方…

linux 互斥量pthread_mutex

专栏内容&#xff1a;linux下并发编程个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e; 目录 前言 概述 原理 初始化 进程和线程使用的不同点 死锁 接口 基本API 属性设置 …

探索机器翻译:从统计机器翻译到神经机器翻译

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Osek网络管理及ETAS实现

OSEK/VDX&#xff08;Offene Systeme und deren Schnittstellen fr die Elektronik in Kraftfahrzeugen / Vehicle Distributed eXecutive&#xff09;是一种用于嵌入式系统&#xff08;尤其是汽车电子控制单元&#xff09;的开放标准。它旨在提供一种统一、可互操作的软件架构…

关于 《python 从入门到实践》的 matplotlib 随机漫步小项目

使用 python 生成随机漫步数据&#xff0c;再使用 matplotlib 将数据呈现。 所谓随机漫步&#xff1a; 每次行走的路径都是完全随机的&#xff0c;就像蚂蚁在晕头转向的情况下&#xff0c;每次都沿随机方向前行路径。 在自然界&#xff0c;物理学&#xff0c;生物学&#xff0…

【Linux】Job for network.service failed(网卡启动报错)

上图是Linux网卡启动报错的情况 这是由于cat/etc/sysconfig/network-scripts/ifcfg-xxx 中HWADDR的MAC地址和ifconfig中的MAC地址不一样&#xff0c;或者缺少cat/etc/sysconfig/network-scripts/ifcfg-xxx 中HWADDR的MAC地址 1.查看ifconfig中的MAC地址 图中00&#xff1a;0c…

【新星计划-2023】IP地址是什么?IP地址的主要功能是什么?

IP地址在生活中是很常见的&#xff0c;我们所使用的手机、电脑等等&#xff0c;都有一个IP地址&#xff0c;那么IP地址是什么&#xff1f;通过IP地址又能干什么&#xff1f;下文就来给大家详细的讲解一下。 一、什么是IP地址 通常我们说的IP地址多数是指互联网中联网的IP地址…

Java 基础进阶篇(十一)—— Arrays 与 Collections 工具类

文章目录 一、Arrays工具类1.1 Arrays 类常用方法1.2 对于 Comparator 比较器的支持1.3 Arrays 的综合应用1.3.1 应用一&#xff1a;数组的降序排序1.3.2 应用二&#xff1a;根据学生年龄进行排序 二、Collections工具类2.1 Collections 类常用方法2.2 Collections 排序相关 AP…

神经网络实验---梯度下降法

本次实验主要目的是掌握梯度下降法的基本原理&#xff0c;能够使用梯度下降法求解一元和多元线性回归问题。 文章目录 目录 文章目录 1. 实验目的 2. 实验内容 3. 实验过程 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 实验小结&讨论题 1. 实验目的 ① 掌握…

〖Python网络爬虫实战㉓〗- Ajax数据爬取之什么是Ajax

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…

23.5.7总结(学习通项目思路)

项目思路&#xff1a; 注册&#xff1a;输入邮箱&#xff08;判重&#xff09;&#xff0c;两次输入密码&#xff0c;获得的正确的验证码&#xff0c;获得不重复的用户名。 登录&#xff1a;输入用户名和密码登录。 忘记密码&#xff1a;输入邮箱&#xff08;和用户名&#…

RK3588平台开发系列讲解(进程篇)可执行文件内部结构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、 ELF 文件的两大组成部分二、文件头三、程序头和节区头四、ELF 文件的细节结构沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在 Linux 中,二进制可执行文件的标准格式叫做 ELF(Executable and Linkabl…

ARP协议结构

文章目录 概念ARP协议格式ARP协议的作用ARP协议的工作流程 首先提出一个问题&#xff0c;来理解ARP解决什么问题 已知报文在数据链路层传输的过程中&#xff08;假设是主机A到主机B&#xff09;&#xff0c;是通过路由器之间的跳转&#xff0c;根据路由表&#xff0c;结合目的…

【论文】SimCLS:一个简单的框架 摘要总结的对比学习(1)

SimCLS:摘要总结的对比学习(1&#xff09; 写在最前面模型框架 摘要1 简介 写在最前面 SimCLS: A Simple Framework for Contrastive Learning of Abstractive Summarization&#xff08;2021ACL会议&#xff09; https://arxiv.org/abs/2106.01890 论文&#xff1a;https://…