Android 里SQLite和ROOM框架简单介绍

简单的Android SQLite使用

最简单的SQLite

在 Android 开发中,SQLite是一个轻量级的关系型数据库管理系统,经常用于存储和管理应用程序的数据。如果你刚刚学习Android数据库的使用,你一定要学习SQLite的使用。以下是一个简单的示例,展示了如何在 Android 应用中创建 SQLite 数据库、创建表、插入数据以及查询数据。

创建 SQLite 数据库、创建表
public class DBHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "mydatabase";private static final int DATABASE_VERSION = 1;// 构造方法public DBHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {// 创建表String createTableQuery = "CREATE TABLE mytable ("+ "id INTEGER PRIMARY KEY AUTOINCREMENT,"+ "name TEXT,"+ "age INTEGER)";db.execSQL(createTableQuery);}
}
在活动或其他地方使用数据库(插入数据以及查询数据)
public class MainActivity extends AppCompatActivity {private DBHelper dbHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);dbHelper = new DBHelper(this);// 插入数据示例insertData("Alice", 25);insertData("Bob", 30);// 查询数据示例String data = queryData();Toast.makeText(this, "Data: " + data, Toast.LENGTH_SHORT).show();}private void insertData(String name, int age) {SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", name);values.put("age", age);db.insert("mytable", null, values);db.close();}private String queryData() {SQLiteDatabase db = dbHelper.getReadableDatabase();String[] projection = {"name", "age"};Cursor cursor = db.query("mytable", projection, null, null, null, null, null);StringBuilder data = new StringBuilder();while (cursor.moveToNext()) {String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));int age = cursor.getInt(cursor.getColumnIndexOrThrow("age"));data.append("Name: ").append(name).append(", Age: ").append(age).append("\n");}cursor.close();db.close();return data.toString();}
}

其中涉及的知识点简要如下:

  • SQLiteOpenHelper: 这个类是用于管理数据库的创建和版本管理的工具类。通过继承这个类,可以方便地管理数据库的创建和升级。
    (1)onCreate(SQLiteDatabase db): 在数据库第一次创建时调用,通常用于创建表和初始化数据。
    (2)onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion): 当数据库版本发生变化时调用,用于执行数据库的升级操作。
  • SQLiteDatabase: 这个类提供了对 SQLite 数据库的操作方法,如插入、查询、更新、删除等。
    (1)getWritableDatabase(): 获取可写数据库实例,用于执行插入、更新、删除等操作。
    (2)getReadableDatabase(): 获取可读数据库实例,用于执行查询操作。
    (3)insert(), update(), delete(), query(): 分别用于插入、更新、删除、查询数据。
  • ContentValues: 这个类用于存储数据库表中的键值对,对应于数据库表中的一行数据。通常用于插入数据时使用。
  • Cursor: 查询数据库时返回的结果集,用于遍历查询结果并获取数据。

如果你没有安装SQLite,存储的数据你要在哪找呢?

如果你没有使用任何 SQLite 数据库查看工具或者终端命令行,在 Android 应用程序中,SQLite 数据库通常存储在应用的私有目录中。这个目录的路径包含你的应用程序的包名,具体位置如下:
如果你在模拟器上运行应用程序,你可以使用 Android Studio 的 Device File Explorer来查看应用的数据目录。
数据库文件通常位于 /data/data/your.app.package/databases/ 目录下,其中 your.app.package 是你的应用程序的包名。

有人会疑问这些类的命名后缀为何吗(题外话,哈哈)

为什么有这些后缀?
  • 清晰性和可维护性:良好的命名约定可以使代码更易于理解和维护。使用适当的后缀可以快速地表明类的作用和功能,例如 Helper表示辅助类,Contract 表示约定类,从而帮助其他开发者或自己在未来更容易地理解和修改代码。
  • 遵循约定俗成:虽然这些后缀不是 Android开发的强制规定,但它们是一种良好的编程实践,符合普遍的命名约定和习惯。这样可以增加代码的一致性,减少团队成员之间理解代码意图的差异。

(嘿嘿嘿,不会以为自己命名,熬到交付就老板不敢裁掉你了吧,毕竟如果交给别人,别人看不懂,嘘~别瞎试)

数据库相关的只能使用这些后缀吗?

除了 Helper 和 Contract,在特定的框架或架构设计下,当然还可能会使用其他后缀或命名约定,例如:

  • Repository:用于封装数据访问和持久化逻辑,如 UserRepository。
  • Manager 或 Handler:用于管理特定数据或处理特定操作,如 DataManager 或 TaskHandler。
  • DAO(Data Access Object):用于定义数据访问接口和操作,如 UserDao。
  • Provider:用于提供数据或服务,如 ContentProvider。
  • Adapter:用于适配数据或操作,如 ListAdapter。
  • Listener:用于处理事件或响应,如 OnClickListener。

ROOM框架下的SQLite

呜呜呜,终于到文章的重点了。既然我们简单的使用SQLite已经无法满足你求知的心,那我们来进一步来一点高级货,香得勒

什么是ROOM框架

Room 是 Android 官方提供的一个持久化库,是一个用于在 SQLite 数据库上进行抽象化和简化Android应用中数据库操作的一个ORM框架。它通过将数据库表映射为Java或Kotlin中的实体类(Entity),以及提供数据访问对象(DAO)来简化数据库操作。ROOM框架支持编译时SQL验证,减少了运行时错误,并且简化了数据库迁移的过程。它允许开发者使用更高级别的抽象概念来操作数据库,从而简化了数据存储和访问的过程。

组件

  • 实体类(Entity)

实体类用于表示数据库中的表。每个实体类都需要用@Entity注解标记,以指明它是一个数据库表。
实体类中的字段默认会被映射为表中的列,除非使用@Ignore注解来忽略某个字段。
每个实体类都必须至少定义一个主键字段,用于唯一标识表中的每一行。主键字段可以使用@PrimaryKey注解来标记。

@Entity(tableName = "users")
public class User {@PrimaryKey(autoGenerate = true)public int id;@ColumnInfo(name = "first_name")public String firstName;@ColumnInfo(name = "last_name")public String lastName;
}
  • 数据访问对象(DAO)

DAO是ROOM框架中的核心组件,它定义了与数据库交互的方法,如增删改查(CRUD)操作。
DAO通常是一个接口,里面包含了多个使用@Insert、@Delete、@Update、@Query等注解标记的方法。
ROOM框架在编译时会为这些DAO接口自动生成实现类,使得开发者无需编写繁琐的SQL语句。

@Dao
public interface UserDao {@Query("SELECT * FROM users")List<User> getAllUsers();@Insertvoid insert(User user);@Deletevoid delete(User user);@Updatevoid update(User user);
}
  • 数据库类(Database)

数据库类用于定义数据库的配置,并作为应用与数据库交互的主要入口点。
数据库类必须是一个继承自RoomDatabase的抽象类,并使用@Database注解来标记。
在@Database注解中,需要指定数据库中包含的实体类(通过entities属性),以及数据库的版本号(通过version属性)。
数据库类中还需要定义一些抽象方法,这些方法返回DAO接口的实例,以便在应用中使用这些DAO来与数据库交互。

@Database(entities = {User.class}, version = 1, exportSchema = false)
public abstract class MyAppDatabase extends RoomDatabase {public abstract UserDao userDao();
}

除此之外,你还可以设计这些:
仓库类(推荐使用哦)
虽然ROOM框架本身不直接要求仓库类,但使用仓库模式是一种将数据访问逻辑与应用业务逻辑分离的好方法。仓库类通常封装了对DAO的调用,并可能还包含缓存逻辑或数据转换逻辑。
示例:UserRepository.java,封装了与User相关的所有数据库操作,并提供更高级别的数据访问接口,让你的代码更加专业。

ViewModel和LiveData/Flow(推荐推荐,与UI交互)
虽然它们不是ROOM框架直接的一部分,但ViewModel和LiveData/Flow是Android Jetpack组件,常与ROOM一起使用来实现响应式UI更新。ViewModel负责准备和管理UI相关的数据,而LiveData或Flow则用于在数据发生变化时通知UI进行更新。
示例:UserViewModel.java,包含LiveData或Flow对象,这些对象在User数据发生变化时更新UI。
天哪,这个真的很管用,尤其如果你要使用MVVM和MVP整体架构的时候。

使用步骤

  • 添加依赖:在 build.gradle 文件中添加 Room 的依赖。
implementation "androidx.room:room-runtime:2.5.0"
annotationProcessor "androidx.room:room-compiler:2.5.0"
  • 定义实体类:使用 @Entity 注解定义数据库中的表结构。
    (如上组件举例)
  • 定义 DAO:使用 @Dao 注解定义数据访问对象,定义需要的数据库操作方法。
  • 创建数据库:继承 RoomDatabase,定义抽象方法来获取 DAO 实例,并使用 @Database 注解配置数据库。
  • 使用数据库:通过获取数据库实例和 DAO 对象,执行数据操作。

主要特性和优点

  • 编译时检查:Room 在编译时会检查 SQL 查询的语法和类型,这可以帮助开发者在编译期间发现潜在的错误。(这其实在某一点上要求你需要提前设计好数据库表,不然作为一个一个小白,你编写完运行后,再来修改你的表,你会看到很多报错,不致命,但心梗,哈哈哈。)

  • 简化数据库操作:通过使用注解和少量的代码,开发者可以轻松地执行数据库操作,而不必编写大量的样板代码。(除去一些ROOM框架无法支持的数据库操作语言,你可能在你的Android studio里看不到SQLite的代码,它自动帮你补充完整,多香啊)

  • LiveData 支持:Room 可以与 Android 架构组件中的 LiveData 结合使用,使得数据库中数据的变化可以自动通知 UI 层,从而简化了数据的观察和更新流程。(这个很重要哦,需要了解)

  • 轻量级:Room 库本身很小,并且不会增加 APK 的大小太多,适合用于移动设备。(对于一些小应用真的再合适不过啦)

其他知识

数据库迁移

ROOM框架支持数据库迁移,当数据库结构发生变化时(如添加新字段、修改表名等),可以通过编写迁移类并指定迁移的起始版本号和目标版本号来实现平滑迁移。

查询优化

ROOM框架支持在编译时验证SQL查询语句,减少运行时错误。此外,还可以通过在实体类中使用@Index注解为字段添加索引,以提高查询效率。
验证SQL查询语句

@Dao  
public interface UserDao {  @Query("SELECT * FROM users WHERE name = :name") //这儿 User findByName(String name);  
}

为字段添加索引

@Entity(indices = {@Index(value = {"firstName", "lastName"}, unique = true)})  
public class User {  @PrimaryKey  public int id;  @ColumnInfo(name = "first_name")  public String firstName;  @ColumnInfo(name = "last_name")  public String lastName;  // 其他字段和方法  
}
  • 在这个示例中,@Index注解被用来为firstName和lastName字段组合创建一个唯一索引。这意味着在users表中,firstName和lastName的组合值必须是唯一的。这不仅可以提高基于这些字段的查询效率,还可以确保数据的唯一性。
协程支持

ROOM框架与Kotlin协程(Coroutine)无缝集成,可以在协程中执行数据库操作,避免在主线程中进行耗时操作导致的界面卡顿问题。

Room与Kotlin协程扩展

ROOM提供了对Kotlin协程的扩展支持,使得数据库操作可以更加简洁地以异步方式执行。开发者可以在DAO接口的方法中使用suspend修饰符,并在调用这些方法时使用协程上下文来执行它们。

Room与Flow

ROOM还提供了与Kotlin Flow的集成,允许开发者以响应式编程的方式处理数据库查询结果。通过使用Flow,开发者可以轻松地监听数据库查询结果的变化,并在结果更新时自动更新UI。

好了,溜了,溜了

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

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

相关文章

优化算法|自适应大邻域搜索算法及MATLAB代码实现

回来填坑了&#xff0c;本篇推文将详细讲解ALNS算法求解VRP问题及MATLAB代码实现。 算法介绍 节约算法构造初始解 function routessaving_init(DistMatrix, Demand, Cap) C_EPS1e-1;Nsize(DistMatrix,1); routescell(numel(2:N),1); for i1:numel(routes) % 每个节点单独一条…

Javascript面试基础6【每日更新10】

Gulp gulp是前端开发过程中一种基于流的代码构建工具&#xff0c;是自动化项目的构建利器;它不仅能对网站资源进行优化&#xff0c;而且在开发过程中很多重复的任务能够使用正确的工具自动完成 Gulp的核心概念:流 流&#xff0c;简单来说就是建立在面向对象基础上的一种抽象的…

【Django】前端技术HTML常用标签(开发环境vscode)

文章目录 安装两个常用插件HTML常用标签定义文档类型DOCTYPE网页的结构html/head//title/body/div标题h1/h2/h3/h4/h5分割线hr段落 p列表ul/li&#xff0c;ol/li超链接a文本span图片img按钮button表格table&#xff08;table、tr、th、td&#xff09;表单form 安装两个常用插件…

基于riscv64架构的Dayu800开发板的napi_demo开发介绍

itopen组织1、提供OpenHarmony优雅实用的小工具2、手把手适配riscv qemu linux的三方库移植3、未来计划riscv qemu ohos的三方库移植 小程序开发4、一切拥抱开源&#xff0c;拥抱国产化 一、环境准备工作 1.1 Ubuntu20.04环境配置 如果已经配置OpenHarmony的编译环境则…

目标检测 YOLOv5-7.0 详细调试自制数据集实战

目标检测 YOLOv5-7.0 详细调试&自制数据集实战 一、项目介绍及环境配置&#xff08;一&#xff09;项目解读&#xff08;二&#xff09;版本选择&#xff08;三&#xff09;环境配置 二、如何利用YOLOv5进行预测&#xff08;detect.py&#xff09;&#xff08;一&#xff0…

Windows 实用小工具:窗口钉子/文件管理 2024/7/27

一: wintop 窗口置顶工具 二:WinDirStat 这是一个免费的、开源的磁盘使用分析工具&#xff0c;适用于Windows系统。它会扫描你的硬盘&#xff0c;列出所有文件和文件夹的大小&#xff0c;并以图形化的方式展示&#xff0c;便于理解。 可以用来检测硬盘文件夹占用从而,酌情处…

【C#】获取DICOM图像像素的像素值

8位像素深度的像素值 public byte GetGreyValue(int x, int y) {x Math.Min(x, m_nWidth - 1);y Math.Min(y, m_nHeight - 1);unsafe{byte* greyValue (byte*)m_pDicomData.ToPointer() y * m_nWidth x;return *greyValue;} } 16位像素深度的像素值 public ushort GetG…

JAVA.抽象、接口、内部类

1.抽象 共性&#xff0c;父类定义抽象方法&#xff0c;子类必须重写&#xff0c;或者子类也是抽象类 示例代码 animal package animalabstract;//定义抽象类animal public abstract class animal {String name;int age;//定义抽象方法eat&#xff0c;子类必须重写public abs…

Java给定一些元素随机从中选择一个

文章目录 代码实现java.util.Random类实现随机取数(推荐)java.util.Collections实现(推荐)Java 8 Stream流实现(不推荐) 完整代码参考&#xff08;含测试数据&#xff09; 在Java中&#xff0c;要从给定的数据集合中随机选择一个元素&#xff0c;我们很容易想到可以使用 java.…

Redis快速入门(一)

一、初识Redis 1、认识NoSQL NoSql可以翻译做Not Only Sql(不仅仅是SQL),或者是No Sql(非Sql的)数据库。是相对于传统关系型数据库而言,有很大差异的一种特殊的数据库,因此也称之为非关系型数据库。   a)结构化与非结构化   传统关系型数据库是结构化数据,每一张…

【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件

目录 ​编辑 前言 系统调用 open 参数flags 参数mode write 追加方式 read close 文件描述符 打开多个文件并观察其文件描述符 C语言文件操作 理解一切皆文件 理解open操作 前言 各类语言的文件操作其实是对系统调用的封装 我们经常说&#xff0c;创建一个文件&a…

力扣第三十七题——解数独

内容介绍 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 数独…

每天一个数据分析题(四百四十四)- 数据仓库

企业数据仓库里面的数据一般是由业务数据经过ETL技术处理后来的&#xff0c;以下关于ETL的说法错误的是 A. ETL过程中的主要环节是数据抽取、数据转换和加工、数据流转 B. 增量数据抽取过程中&#xff0c;提取增量数据的方法有通过时间戳、建立触发器、全表比对、日志比对等 …

springboot整合pgsql

demo代码说明 springboot使用mybatis-plus整合pgsql 在springboot项目中使用pgsql&#xff0c;使用了mybatis-plus、druid 代码见 spring-demo: springboot 结合各种插件 demo 注意事项&#xff1a; 版本兼容 正常springboot使用&#xff0c;但是注意需要添加pgsql正确版…

CVE-2024-39700 (CVSS 9.9):JupyterLab 模板中存在严重漏洞

在广泛使用的 JupyterLab 扩展模板中发现了一个严重漏洞&#xff0c;编号为CVE-2024-39700 。此漏洞可能使攻击者能够在受影响的系统上远程执行代码&#xff0c;从而可能导致大范围入侵和数据泄露。 该漏洞源于在扩展创建过程中选择“测试”选项时自动生成“update-integratio…

VIM基础配置

1. CTAGS配置 下载 上传虚拟机&#xff0c;解压&#xff0c;进入目录 tar -xzvf ctags-5.8.tar.gz cd ctags-5.8/编译 ./configure sudo make sudo make install查看是否安装成功 ctags --version打印如下 2. 使用Vundle 下载 git clone https://github.com/VundleVim/Vund…

Linux并发程序设计(3):守护进程

目录 前言 一、介绍 1.1 概念 1.2 特点 1.3 举例 二、系统编程 2.1 setsid函数 2.2 getpid函数 2.3 getsid函数 2.4 getpgid函数 2.5 chdir函数 三、代码例程 3.1 使子进程在后台运行 3.2 使子进程脱离原终端 3.3 更换目录&#xff0c;并设定权限&#xff08;非…

React--Redux

Redux 是一个用于 JavaScript 应用的状态管理库&#xff0c;特别是在 React 应用中非常流行。下面我将详细介绍一个使用 Redux 的简单案例&#xff0c;包括设置 Redux 环境、创建 store、定义 actions 和 reducers&#xff0c;以及如何连接 React 组件。 步骤 1: 安装依赖 首…

基于STM32通过云平台实现智慧大棚【手机远程查看温湿度】【报警】

文章目录 一、成果演示二、所用到的模块三、实现的功能四、接线说明五、WIFI模块配置步骤5.1云平台介绍5.2云平台使用5.3使用USB转TTL测试联通云平台 六、STM32代码编写七、手机上查看数据6.1下载软件&#xff08;仅限安卓手机&#xff09;6.2操作 一、成果演示 STM32通过物联网…