Android开发使用Room(SQLite封装)操作数据库

news/2024/5/5 20:20:50/文章来源:https://blog.csdn.net/qq_15181569/article/details/127673958

一、Room介绍

           Android采用Sqlite作为数据库存储。Sqlite代码写起来繁琐且容易出错,所以开源社区里逐渐出现了各种ORM(Object Relational Mapping)库。这些开源ORM库都是为了方便Sqlite的使用,包括数据库的创建,升级,增删改查等。常见的ORM有ORMLite,GreenDAO等。Google也意识到了推出自家ORM的必要性,于是有了Room。
           Room和其它ORM库一样,也是在Sqlite上提供了一层抽象。
在介绍Room的使用之前,我们需要先明白几个概念。
Entity:这是一个Model类,对应于数据库中的一张表。Entity类是Sqlite表结构在Java类的映射。
Dao:(Data Access Objects)数据访问对象,顾名思义,我们可以通过它来访问数据。
总的来说就是通过注解的方式操作数据库

二、代码实现

1、添加依赖并同步

在工程build.gradle中添加下面几句

    def room_version = "2.2.0-alpha01"implementation "androidx.room:room-runtime:$room_version"annotationProcessor "androidx.room:room-compiler:$room_version"

在这里插入图片描述

2、新建一个类通过@Database注解生成一个数据库

StudentDatabase.java

package com.example.learning01;import android.content.Context;import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;@Database(entities = {Student.class},version = 1,exportSchema = false)//关联数据库
public abstract class StudentDatabase extends RoomDatabase {//用户只需要操作DAOpublic abstract StudentDao get_student_dao();//单例模式private static StudentDatabase studentDatabase;public static synchronized StudentDatabase getInstance(Context context){if(studentDatabase == null){studentDatabase = Room.databaseBuilder(context.getApplicationContext(),StudentDatabase.class,"student_database")//.allowMainThreadQueries() //主线程也能操作数据库 只能测试用.build();}return studentDatabase;}
}

3、新建一个类通过@Entity注解生成一个表

Student.java

package com.example.learning01;import androidx.room.Entity;
import androidx.room.PrimaryKey;//一张表
@Entity
public class Student {@PrimaryKey(autoGenerate = true)private int id;private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}

4、新建一个类通过@Dao实现增、删、改、查

StudentDao.java

package com.example.learning01;import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;import java.util.List;@Dao
public interface StudentDao {//增@Insertvoid insert_student(Student ... students);//改@Updatevoid update_student(Student ... students);//删@Deletevoid delete_student(Student ... students);//删@Query("DELETE FROM Student")void delete_all_student();//查@Query("SELECT * FROM Student ORDER BY id DESC")List<Student> get_all_student();
}

5、新建一个类通过实现数据库操作,通过异步方式

DBEngine.java

package com.example.learning01;import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;import java.util.List;public class DBEngine {private static final String TAG = "DBEngine";private StudentDao studentDao;public DBEngine(Context context) {StudentDatabase studentDatabase = StudentDatabase.getInstance(context);studentDao = studentDatabase.get_student_dao();}//插入public void insert_student(Student ... student) {new InsertAsynTask(studentDao).execute(student);}//更新public void update_student(Student ... student) {new UpdateAsynTask(studentDao).execute(student);}//删除public void delete_student(Student ... student) {new DeleteAsynTask(studentDao).execute(student);}//全部删除public void delete_all_student(Student ... student) {new DeleteAllAsynTask(studentDao).execute();}//全部查询public void quary_all_student(Student ... student) {new QuaryAllAsynTask(studentDao).execute();}//开启异步操作static class InsertAsynTask extends AsyncTask<Student,Void,Void> {private StudentDao studentDao;public InsertAsynTask(StudentDao studentDao) {this.studentDao = studentDao;}@Overrideprotected Void doInBackground(Student ... students) {studentDao.insert_student(students);return null;}}static class UpdateAsynTask extends AsyncTask<Student,Void,Void> {private StudentDao studentDao;public UpdateAsynTask(StudentDao studentDao) {this.studentDao = studentDao;}@Overrideprotected Void doInBackground(Student... students) {this.studentDao.update_student(students);return null;}}static class DeleteAsynTask extends AsyncTask<Student,Void,Void> {private StudentDao studentDao;public DeleteAsynTask(StudentDao studentDao) {this.studentDao = studentDao;}@Overrideprotected Void doInBackground(Student... students) {this.studentDao.delete_student(students);return null;}}//全部删除static class DeleteAllAsynTask extends AsyncTask<Void,Void,Void> {private StudentDao studentDao;public DeleteAllAsynTask(StudentDao studentDao) {this.studentDao = studentDao;}@Overrideprotected Void doInBackground(Void... voids) {this.studentDao.delete_all_student();return null;}}static class QuaryAllAsynTask extends AsyncTask<Void,Void,Void> {private StudentDao studentDao;public QuaryAllAsynTask(StudentDao studentDao) {this.studentDao = studentDao;}@Overrideprotected Void doInBackground(Void... voids) {List<Student> all_student = this.studentDao.get_all_student();//遍历全部查询的结果for (Student student:all_student){Log.i(TAG, "doInBackground: "+student.toString());}return null;}}
}

三、操作数据库

首先定义一个引擎

 private DBEngine dbEngine;

然后实现

dbEngine = new DBEngine(this);

完整代码

public class MainActivity extends AppCompatActivity {private static final String TAG ="MainActivity";private DBEngine dbEngine;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);dbEngine = new DBEngine(this);}

1、增

    public void insert_db(View view) {Student student1 = new Student("xupeng1",10);Student student2 = new Student("xupeng2",20);Student student3 = new Student("xupeng3",30);Student student4 = new Student("xupeng4",40);dbEngine.insert_student(student1,student2,student3,student4);}

2、删

    public void delete_db(View view) {Student student = new Student(null,0);student.setId(3);dbEngine.delete_student(student);}public void delete_all_db(View view) {dbEngine.delete_all_student();}

3、改

    public void update_db(View view) {Student student = new Student("weipan",500);student.setId(3);dbEngine.update_student(student);}

4、查

    public void find_db(View view) {dbEngine.quary_all_student();}

四、操作数据库源码

package com.example.learning01;
import androidx.appcompat.app.AppCompatActivity;import android.annotation.SuppressLint;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;public class MainActivity extends AppCompatActivity {private static final String TAG ="MainActivity";private DBEngine dbEngine;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);dbEngine = new DBEngine(this);}public void create_db(View view) {}public void find_db(View view) {dbEngine.quary_all_student();}public void insert_db(View view) {Student student1 = new Student("xupeng1",10);Student student2 = new Student("xupeng2",20);Student student3 = new Student("xupeng3",30);Student student4 = new Student("xupeng4",40);dbEngine.insert_student(student1,student2,student3,student4);}public void update_db(View view) {Student student = new Student("weipan",500);student.setId(3);dbEngine.update_student(student);}public void delete_db(View view) {Student student = new Student(null,0);student.setId(3);dbEngine.delete_student(student);}public void delete_all_db(View view) {dbEngine.delete_all_student();}
}

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

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

相关文章

【计组 期末版】1.计算机系统概论(一)勇闯期末考试

【计组 期末版】1.计算机系统概论&#xff08;一&#xff09;搞定期末 前言 博主主页&#xff1a;潮.eth的博客_CSDN博客-C学习,C学习,数据结构and算法领域博主 文章目录&#xff1a;【计组 期末版】计算机组成原理笔记目录 正文 文章目录【计组 期末版】1.计算机系统概论&…

Java NIO 关键概念之 Buffer

一、前言 Java NIO 的三大关键概念之一是 Buffer&#xff0c;在一些文章/源代码中&#xff0c;我们也经常会看到 Buffer 相关的信息。Buffer 到底是什么&#xff0c;Buffer 的基本使用方法是什么&#xff0c;这是本文主要要说的。 二、Buffer 的基本概念 Buffer自 JDK1.4 引…

快速教你如何搭建数据驱动自动化测试框架?

一、前言 说到数据驱动自动化测试&#xff0c;你会不会有这样的疑问&#xff1a;数据怎么管理&#xff1f;数据怎么才能驱动测试用例执行&#xff1f;到底怎么样才算数据驱动&#xff1f;那么本篇文章就教你如何进行数据驱动测试&#xff0c;相信你一定能对数据驱动自动化测试…

拓端tecdat|R语言向量自回归模型(VAR)及其实现

全文链接&#xff1a;http://tecdat.cn/?p6916 原文出处&#xff1a;拓端数据部落公众号 澳大利亚在2008 - 2009年全球金融危机期间发生了这种情况。澳大利亚政府发布了一揽子刺激计划&#xff0c;其中包括2008年12月的现金支付&#xff0c;恰逢圣诞节。因此&#xff0c;零售…

巧妙使用多个旧路由器无线中继提升网络速度

巧用多个路由器进行无线桥接或无线中继&#xff0c;提升网络速度 一、设备选择 1、百兆旧路由器&#xff0c;3-4个&#xff0c;用于无线中继WIFI信号&#xff0c;输出给多WAN路由器&#xff08;DI-8200&#xff09; 历史遗留百兆旧路由器3个&#xff0c;型号分别为腾达FH456…

3、用手机模拟器上的Autojs连接电脑vscode

文章目录1、下载模拟器2、在模拟器上安装Autojs3、连接vscode1、下载模拟器 这里推荐雷电模拟器 https://www.ldmnq.com/?n6005 2、在模拟器上安装Autojs 3、连接vscode 打开autojs打开侧边栏&#xff0c;然后选择连接电脑&#xff0c;打开服务器模式然后复制这个IP地址 4.…

浅谈 Mybatis 动态数据源切换是如何实现的

前言 小憩是辣么的让人神往&#xff0c;就像备战高考靠窗位置的那个你&#xff0c;肆无忌道的放空自己&#xff0c;望着深蓝色宁静的天空&#xff0c;思考着未来该何去何从&#xff0c;近处一颗高大魁梧的银杏树在炎炎夏日中尽情的摇曳着自己嫩绿的枝丫&#xff0c;迸发出无尽的…

计算机毕业设计ssm+vue基本微信小程序的高速公路服务区充电桩在线预订系统 uniapp 小程序

项目介绍 随着网络技术的发展,当前人们的生活模式发生了巨大的变化,特别是以电子商务为代表的产业影响了人们的生活。当前,电子商务成为振兴国家经济的重要手段,电子商务为人们的生活提供了极大的便利,帮助企业降低销售成本,提高销售效率。高速公路服务区作为传统的实体行业,经…

BGP BFD测试案例

一、BFD原理 1.1 BFD技术简介 一种全网统一、检测迅速、监控网络中链路或者IP路由的双向转发连通状况&#xff0c;并未上层应用提供服务的技术。 1.2 BFD会话建立方式和监测机制 ●BFD的标识符&#xff1a; &#xff08;1&#xff09;BFD建立会话存在标识符的概念&#xff…

中小企业数字化思考:数字化转型应该走自己的路

随着数字化的发展&#xff0c;以及数字中国概念的形成&#xff0c;和以前国央企宣布数字化转型时的不同&#xff0c;现在越来越多的企业开始寻求数字化转型&#xff0c;促使自身业务能够更好的发展。现在看过去&#xff0c;各行各业都有大量企业进行了数字化转型规划&#xff0…

【Mac】VSCode 更新1.73版本后JSTS代码跳转异常

前言 今天有小伙伴MacOS更新了VS Code版本后&#xff0c;说工程内的代码跳转全部异常了&#xff0c;没法正确跳转。搞了两三个小时没搞出来&#xff0c;找到了我&#xff0c;让我帮忙瞧瞧。排查下来发现这问题有点意思&#xff0c;故此记录一下。 问题 排查姿势 1. 提示没有定…

Skywalking9.2.0监控浏览器

Skywalking9.2.0监控浏览器 安装skywalking-client-js npm install skywalking-client-js --save在main.js添加信息 import ClientMonitor from skywalking-client-jsrouter.afterEach(() > {ClientMonitor.setPerformance({service: 服务名,serviceVersion: 版本号,pagePat…

基于模糊小波神经网络的空中目标威胁评估(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 在现代战争中, 随着信息化和智能化的飞速发展, 以及作战环境的日益复杂, 实时而准确地评估目标威胁, 不仅为空战决策提供科学的…

程序人生:技术水平低,就这还敢写自动化项目实战经验丰富?

今年部门要招两个自动化测试&#xff0c;这几个月我面试了几十位候选人。发现一个很奇怪的现象&#xff0c;面试中一问到元素定位、框架api、脚本编写之类的&#xff0c;很多候选人都对答如流。但是一问到实际项目&#xff0c;比如 “如何从0开始搭建自动化体系”、“如果让你来…

资深大牛纯手写RabbitMQ 核心笔记,还有谁?

RabbitMQ简介 RabbitMQ是消息代理(Message Broker)&#xff0c;它支持多种异步消息处理方式&#xff0c;最常见的有&#xff1a; Work Queue&#xff1a;将消息缓存到一个队列&#xff0c;默认情况下&#xff0c;多个worker按照Round Robin的方式处理队列中的消息。每个消息只…

CART回归树算法

【题目1】 表1为拖欠贷款人员训练样本数据集,使用CART算法基于该表数据构造决策树模型,并使用表2中测试样本集确定剪枝后的最优子树。 表1 拖欠贷款人员训练样本数据集编号 房产状况 婚姻情况 年收(千元) 拖欠贷款1 是 单身 125 否2 否 已婚 100 否3 否 单身 70 否4 是 已婚…

一本通1064;奥运奖牌计数

#include <iostream> using namespace std; int main() {int n, Jin, Yin, Tong;int JinSum 0, YinSum 0, TongSum 0, sum;cin >> n;for (int i 1; i < n; i) // 循环n次{cin >> Jin >> Yin >> Tong; // 输入一天获得的金银铜牌数JinSum …

IR信息检索前沿梳理

1. 检索预训练 1.1 PROP: Pre-training with Representative Words Prediction for Ad-hoc Retrieval three types of pre-training tasks have been proposed including: Inverse Cloze Task (ICT): The query is a sentence randomly drawn from the passage and the docu…

全志F1C芯片参数对比,供查阅

F1C600特性介绍 组合32M DDR1&#xff0c;QFN编解码模式&#xff0c;生产音频核心板&#xff08;CPUNORWIFI&#xff09;在WIFI站下播放的功率约0.5W组合I2S、SPDIF、CODEC等多功能接口支持全格式音频解码芯片 F1C600参数介绍 中央处理器 ARM926EJ-S 内存 SIP DDR1 SD2.0…