Android数据存储:SQLite、Room

在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s)等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,但是主键只能是Integer类型的。Sqlite数据库一般要求主键是_id,当然也可以是id。android里面的数据库是由底层的sqilte.c的代码来动态生成的。

详细使用参考: 【Android入门到项目实战--4.5】—— SQLite数据库存储实现增删改查_android sqlite数据库增删改查-CSDN博客

Android Room 是 Android 官方提供的一个持久性库,用于在 Android 应用程序中管理数据库。它提供了一个对象关系映射(ORM)层,允许您在应用程序中使用对象来表示数据库表和数据行,并自动生成与之相关的SQL查询和操作。

Room使用

1.在build.gradle文件中添加依赖
def room_version = "2.6.1"implementation "androidx.room:room-runtime:$room_version"annotationProcessor "androidx.room:room-compiler:$room_version"

2.创建一个数据实体类:实体表示应用的数据库中的表。数据实体用于更新表中的行所存储的数据以及创建新行供插入。

使用 Room 实体定义数据  |  Android Developers (google.cn)

3.创建一个数据访问对象 (DAO):提供在数据库中查询、更新、插入和删除数据的方法。

使用 Room DAO 访问数据  |  Android Developers (google.cn)

4.创建一个数据库类:数据库类用于定义实体和数据访问对象的列表。它也是底层连接的主要访问点。

@Database(entities = {Student.class},version = 1,exportSchema = false)
public abstract class StudentDatabase extends RoomDatabase {public abstract StudentDao getStudentDao();private static StudentDatabase INSTANCE;public static synchronized StudentDatabase getInstance(Context context){if (INSTANCE == null){INSTANCE = Room.databaseBuilder(context.getApplicationContext(),StudentDatabase.class,"student_database").build();}return INSTANCE;}}
  • 该类必须带有@Database注解,entities指明包含的实体, version表明版本,将 version 设为 1。每当更改数据库表的架构时,都必须提升版本号。将 exportSchema 设为 false,这样就不会保留架构版本记录的备份。
  • 该类必须是一个抽象类,用于继承RoomDatabase。
  • 对于与数据库关联的每个 DAO 类,数据库类必须定义一个具有零参数的抽象方法,并返回 DAO 类的实例。
  • 使用Room的Room.databaseBuilder创建数据库。不过,仅当该数据库不存在时才应创建。否则,请返回现有数据库。

5.创建一个类实现数据库异步操作

public class DBEngine {private StudentDao studentDao;public DBEngine(Context context) {StudentDatabase studentDatabase = StudentDatabase.getInstance(context);studentDao = studentDatabase.getStudentDao();}public void insertStudents(Student... students){new InsertAsyncTask(studentDao).execute(students);}public  void deleteStudents(Student... students){new DeleteAsyncTask(studentDao).execute(students);}public void updateStudents(Student... students){new UpdateAsyncTask(studentDao).execute(students);}public  void deleteAllStudent(){new DeleteAllAsyncTask(studentDao).execute();}public  void queryStudents(){new QueryAllAsyncTask(studentDao).execute();}//插入static class InsertAsyncTask extends AsyncTask<Student,Void,Void>{private StudentDao dao;public InsertAsyncTask(StudentDao studentDao) {dao = studentDao;}@Overrideprotected Void doInBackground(Student... students) {dao.insertStudents(students);return null;}}//修改static class UpdateAsyncTask extends AsyncTask<Student,Void,Void>{private StudentDao dao;public UpdateAsyncTask(StudentDao studentDao) {dao = studentDao;}@Overrideprotected Void doInBackground(Student... students) {dao.updateStudents(students);return null;}}//删除static   class DeleteAsyncTask extends AsyncTask<Student,Void,Void>{private StudentDao dao;public DeleteAsyncTask(StudentDao studentDao) {dao = studentDao;}@Overrideprotected Void doInBackground(Student... students) {dao.deleteStudents(students);return null;}}//全部删除static class DeleteAllAsyncTask extends AsyncTask<Void,Void,Void>{private StudentDao dao;public DeleteAllAsyncTask(StudentDao studentDao){dao = studentDao;}@Overrideprotected Void doInBackground(Void... voids) {dao.deleteAllStudents();return null;}}//全部查询static class QueryAllAsyncTask extends AsyncTask<Void,Void,Void>{private StudentDao dao;public QueryAllAsyncTask(StudentDao studentDao){dao = studentDao;}@Overrideprotected Void doInBackground(Void... voids) {List<Student> allStudents = dao.getAllStudents();for (Student s : allStudents) {Log.e("search", "doInBackground:全部查询每一项"+ s.toString() );}return null;}}

6.MainActivity

public class MainActivity2 extends AppCompatActivity {private DBEngine dbEngine;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);dbEngine = new DBEngine(this);}public void insertAction(View view) {Student student = new Student("jerry",8);Student student1 = new Student("tom",9);Student student2 = new Student("jack",10);dbEngine.insertStudents(student,student1,student2);}public void deleteAction(View view) {Student student = new Student(null,0);student.setId(2);dbEngine.deleteStudents(student);}public void updateAction(View view) {Student student = new Student("lili",20);student.setId(3);dbEngine.updateStudents(student);}public void queryAction(View view) {dbEngine.queryStudents();}public void deleteAllAction(View view) {dbEngine.deleteAllStudent();}
}

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

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

相关文章

C 指针数组

C 指针数组是一个数组&#xff0c;其中的每个元素都是指向某种数据类型的指针。 指针数组存储了一组指针&#xff0c;每个指针可以指向不同的数据对象。 指针数组通常用于处理多个数据对象&#xff0c;例如字符串数组或其他复杂数据结构的数组。 让我们来看一个实例&#xf…

【快捷部署】008_Docker(25.0.5)

&#x1f4e3;【快捷部署系列】008期信息 编号选型版本操作系统部署形式部署模式复检时间008Docker25.0.5Ubuntu 20.04apt-2024-03-27 一、快捷部署 #!/bin/bash ################################################################################# # 作者&#xff1a;cxyt…

大话设计模式之模板方法模式

模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个算法的框架&#xff0c;将特定步骤的实现延迟到子类中。模板方法模式通过在父类中定义算法的骨架&#xff0c;而将具体步骤的实现留给子类来完成&#xff0c;从而使子类…

机器人是怎么计时的(通用定时器 - 时基单元)

目录 一&#xff0c;引言 二&#xff0c;机器人的“大脑” 三&#xff0c;时基单元介绍 1&#xff0c;定时器框图 2&#xff0c;时基单元 &#xff08;1&#xff09;预分频器 &#xff08;2&#xff09;CNT计数器 &#xff08;3&#xff09;自动重装载寄存器 四&#…

图论—树的直径(树形DP、BFS)

树的直径——树形 D P 、两次 B F S \Huge{树的直径——树形DP、两次BFS} 树的直径——树形DP、两次BFS 文章目录 树形DP两次BFS 不再详细解释代码&#xff0c;只记录完整模板。 树形DP 可以计算负权边。 时间复杂度&#xff1a; O ( n ) O(n) O(n)。 设 D [ x ] D[x] D[x]表…

如何在jupyter使用新建的虚拟环境以及改变jupyter启动文件路径。

对于刚刚使用jupyter的新手来说&#xff0c;经常不知道如何在其中使用新建的虚拟环境内核&#xff0c;同时&#xff0c;对于默认安装的jupyter&#xff0c;使用jupyter notebook命令启动 jupyter 以后往往默认是C盘的启动路径&#xff0c;如下图所示&#xff0c;这篇教程将告诉…

Django使用pyJwt进行token校验

1.登录成功后返回token&#xff0c;这里使用authenticate进行校验是否存在该用户 def login(request):try:data json.loads(request.body)username data.get(username)password data.get(password)if not all([username, password]):return to_response(status400, msg参数…

深入在线文档系统的 MarkDown/Word/PDF 导出能力设计

深入在线文档系统的 MarkDown/Word/PDF 导出能力设计 当我们实现在线文档的系统时&#xff0c;通常需要考虑到文档的导出能力&#xff0c;特别是对于私有化部署的复杂ToB产品来说&#xff0c;文档的私有化版本交付能力就显得非常重要&#xff0c;此外成熟的在线文档系统还有很…

中伟视界:智能识别!电动车戴头盔系统,保障您的安全出行

电动车AI头盔识别系统是一种利用人工智能技术提高道路安全的创新应用。该系统的核心目的是确保电动车驾驶者遵守交通安全规则&#xff0c;特别是佩戴头盔这一基本安全措施。通过自动识别驾驶者是否佩戴头盔&#xff0c;这一系统能够鼓励更为安全的骑行行为&#xff0c;减少交通…

Android客户端自动化UI自动化airtest从0到1搭建macos+demo演示

iOS客户端自动化UI自动化airtest从0到1搭建macosdemo演示-CSDN博客 一、基础环境 1. 安装jdk 选择jdk8 如果下载高版本 可能不匹配会失败 下载.dmg文件 苹果电脑 &#xff5c; macOS &#xff5c; jdk1.8 &#xff5c; 环境变量配置_jdk1.8 mac-CSDN博客 Java Downloads …

【LeetCode热题100】105. 从前序与中序遍历序列构造二叉树(二叉树)

一.题目要求 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 二.题目难度 中等 三.输入样例 示例 1: 输入: preorder [3,9,20,15,7], inorder…

【前端】layui学习笔记

参考视频&#xff1a;LayUI 1.介绍 官网&#xff1a;http://layui.apixx.net/index.html 国人16年开发的框架,拿来即用,门槛低 … 2. LayUi的安装及使用 Layui 是一套开源的 Web UI 组件库&#xff0c;采用自身轻量级模块化规范&#xff0c;遵循原生态的 HTML/CSS/JavaScript…

Docker Compose环境的安装通过docker compose完成python程序的运行

目录 Docker Compose环境的安装 通过docker compose完成python程序的运行 Docker Compose环境的安装 ##### 方法一&#xff1a;直接下载编译好的二进制文件 注意&#xff1a;只有linux平台上在安装docker时没有安装docker-compose&#xff0c;windows、macos安装docker时自…

C# wpf 嵌入wpf控件

WPF Hwnd窗口互操作系列 第一章 嵌入Hwnd窗口 第二章 嵌入WinForm控件 第三章 嵌入WPF控件&#xff08;本章&#xff09; 文章目录 WPF Hwnd窗口互操作系列前言一、如何实现&#xff1f;1、继承HwndHost2、添加Content属性3、创建wpf窗口并设置Content4、关闭wpf窗口 二、完整…

Android卡顿掉帧问题分析之实战篇

本文将结合典型实战案例&#xff0c;分析常见的造成卡顿等性能问题的原因。从系统工程师的总体角度来看 &#xff0c;造成卡顿等性能问题的原因总体上大致分为三个大类&#xff1a;一类是流程执行异常&#xff1b;二是系统负载异常&#xff1b;三是编译问题引起。 1 流程执行异…

pulsar: 批量接收消息

接收消息时&#xff0c;和kafka类似&#xff0c;如果topic有多个分区&#xff0c;则只能保证分区内数据的接收有序&#xff0c;不能保证全局有序。 一、发送消息 package cn.edu.tju.test1;import org.apache.pulsar.client.api.*;public class BatchProducer01 {private sta…

边缘计算迎来“量子飞跃”!支持抗量子密码,AMD推出FPGA新系列

3月6日&#xff0c;AMD宣布推出AMD Spartan™ UltraScale™ FPGA系列&#xff0c;这是AMD成本优化FPGA和自适应SoC广泛产品组合的最新成员。 距离1月22日&#xff0c;AMD推出业界首款符合VESA DisplayPort 2.1标准的FPGA和自适应SoC实现&#xff0c;也才过了一个多月的时间。 S…

【深度学习基础(4)】pytorch 里的log_softmax, nll_loss, cross_entropy的关系

一、常用的函数有&#xff1a; log_softmax,nll_loss, cross_entropy 1.log_softmax log_softmax就是log和softmax合并在一起执行&#xff0c;log_softmaxlogsoftmax 2. nll_loss nll_loss函数全称是negative log likelihood loss, 函数表达式为&#xff1a;f(x,class)−x[…

【opencv】教程代码 —ImgProc (5)提取图像中水平线和垂直线的opencv示例

5. Morphology_3.cpp 提取图像中水平线和垂直线的opencv示例 原图notes.png 灰度化 二值化 提取水平线 提取垂直线 对垂直图像取反 提取边缘 使用膨胀操作处理边缘 平滑处理&#xff1a;vertical.copyTo(smooth); blur(smooth, smooth, Size(2, 2)); smooth.copyTo(vertical, e…

【spring】@Component注解学习

Component介绍 Component 是 Spring 框架中的一个注解&#xff0c;用于将一个类标记为 Spring 上下文中的一个组件。当一个类被标记为 Component 时&#xff0c;Spring 容器会在启动时自动扫描并实例化这个类&#xff0c;并将其注册到 Spring 上下文中。 Component 注解可以用…