Android移动应用开发之使用room实现数据库的增删改查

news2025/7/8 21:25:41

文章目录

  • 前言
  • 核心代码

前言

我们直接开门见山,展示一下效果:
数据库的插入和查询:
在这里插入图片描述

数据库的修改和查询:
在这里插入图片描述
可以看到id为23的数据发生了修改。

删除一条数据:
在这里插入图片描述
可以看到id为23的数据被删除了

删除全部数据:
在这里插入图片描述
可以看到,数据全都被删除了。
完整代码可运行项目:Android移动应用开发之使用room实现数据库的增删改查

注意:因为设置表的id是主键且自增,因此插入数据id就会持续增加,因为修改和删除都是在MainActivity中手动设置的,是个比较简单的demo,如果需要看到修改和条件删除的效果
在这里插入图片描述
修改此处的setId中的参数即可。

核心代码

首先需要添加依赖build.gridle中:

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

定义一张数据表,这里id设置为逐渐且自动增长,就比较方便了。

//一张表
@Entity
public class Student {
    //主键唯一,自动增长
    @PrimaryKey(autoGenerate = true)
    private  int id;

    private String name;

    private int age;
    }

然后设置getter和setter的方法,以及带参数的构造方法,就是一个完整的表了:

package demo.demo.room;

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 String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

然后建立一个StudentDatabase抽象类,用于数据库的创建:

package demo.demo.room;

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 {
    //暴露Dao
    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")
//                    .allowMainThreadQueries()
                    .build();
        }
        return INSTANCE;
    }
}

然后创建一个能对数据库进行增删改查的Dao接口:

package demo.demo.room;

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 {
    @Insert
    void insertStudents(Student...students);

    @Update
    void updateStudents(Student...students);

    //条件删除
    @Delete
    void deleteStudents(Student...students);

    //删除所有
    @Query("DELETE FROM Student")
    void deleteAllStudents();

    @Query("SELECT * FROM Student ORDER BY ID DESC")
    List<Student>getAllStudent();

}

最后就是编写数据库的引擎,具体对数据库进行操作,发挥实质性作用(采用异步操作):

package demo.demo.room.manager;

import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;

import java.util.List;

import demo.demo.room.Student;
import demo.demo.room.StudentDao;
import demo.demo.room.StudentDatabase;

public class DBEngine {
    private StudentDao studentDao;

    public DBEngine(Context context){
        StudentDatabase studentDatabase = StudentDatabase.getInstance(context);
        studentDao = studentDatabase.getStudentDao();
    }
    public void insertStudent(Student...students){
        new InsertAsyncTask(studentDao).execute(students);
    }

    public void updateStudents(Student...students){
        new UpdateAsyncTask(studentDao).execute(students);
    }

    public void deleteStudents(Student...students){
        new DeleteAsyncTask(studentDao).execute(students);
    }

    public void deleteAllStudents(){
        new DeleteAllAsyncTask(studentDao).execute();
    }

    public void queryAllStudents(){
        new QueryAllAsyncTask(studentDao).execute();
    }

    //异步
    static class UpdateAsyncTask extends AsyncTask<Student, Void, Void>{
        private StudentDao dao;
        public UpdateAsyncTask(StudentDao studentDao){
            dao = studentDao;
        }
        @Override
        protected 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;
        }
        @Override
        protected 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;
        }
        @Override
        protected 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;
        }
        @Override
        protected Void doInBackground(Void... students) {
            List<Student> allStudent = dao.getAllStudent();
            //遍历全部查询的结果
            for(Student student : allStudent){
                Log.e("Hunter", student.toString());
            }
            return null;
        }
    }

    static class InsertAsyncTask extends AsyncTask<Student, Void, Void>{
        private StudentDao dao;
        public InsertAsyncTask(StudentDao studentDao){
            dao = studentDao;
        }
        @Override
        protected Void doInBackground(Student... students) {
            dao.insertStudents(students);
            return null;
        }
    }
}

最后MainActivity进行引擎的调用,对数据库进行操作:

package demo.demo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import demo.demo.room.Student;
import demo.demo.room.manager.DBEngine;

public class MainActivity extends AppCompatActivity {
    private DBEngine dbEngine;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dbEngine = new DBEngine(this);
    }

    public void insertAction(View view) {
        Student student1 = new Student("hunter", 10);
        Student student2 = new Student("icy hunter", 10);
        dbEngine.insertStudent(student1, student2);
    }

    public void updateAction(View view) {
        Student student = new Student("hunterr", 20);
        //修改下标为23的
        student.setId(23);
        dbEngine.updateStudents(student);
    }

    public void deleteAction(View view) {
        Student student = new Student(null, 0);
        student.setId(23);
        dbEngine.deleteStudents(student);
    }

    public void queryAction(View view) {
        dbEngine.queryAllStudents();
    }

    public void deleteAllAction(View view) {
        dbEngine.deleteAllStudents();
    }
}

上面增删改查的操作和布局中的按钮绑定即可。

运行效果就如开局所示。

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

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

相关文章

Sedex验厂有证书吗?

【Sedex验厂有证书吗&#xff1f;】 SEDEX 是一个全球性的会员制组织&#xff0c;旨在帮助企业在负责任商业中去繁存简&#xff0c;携手共进。买家、供应商和审计员可以在平台上快速轻松地储存、共享和报告信息。 SMETA&#xff08;Sedex Members Ethical Trade Audit&#xff…

日本知名汽车零部件公司巡礼系列之株式会社111

株式会社111 业务内容&#xff1a; . 在所有领域的零件缴纳各种都有相应的实际业绩 &#xff08;例&#xff09;OA器械、光学器械、汽车其他运送器械、医疗器械、各种制造装置零件、机器人相关零件、能源相关零件、航空相关零件等 广泛应对各种材料产品 铁、铝、不锈钢、合…

【FLASH存储器系列八】ONFI数据接口详述之一

目录 1.1 数据接口类型概览 1.2 信号功能分配 1.3 接口模式切换 1.1 数据接口类型概览 ONFI目前支持5中不同的数据接口类型&#xff1a;SDR&#xff0c;NV-DDR&#xff0c;NV-DDR2、NV-DDR3和NV-LPDDR4。SDR是传统的NAND接口&#xff0c;使用RE_n锁存读数据&#xff0c;WE_n锁…

MSP430F5529库函数——模数转换模块(ADC12)软件触发

需提前观看&#xff1a;MSP430F5529库函数学习——串口 目录 代码 ADC初始化部分 引脚复位 ADC12_A_init&#xff08;&#xff09; 函数声明 baseAddress sampleHoldSignalSourceSelect clockSourceSelec clockSourceDivider ADC12_A_enable&#xff08;&#xff09;…

有关javascript中事件对象e

一、简单认识e 事件对象e&#xff0c;是event的简称。当一个事件被触发时候&#xff0c;这个事件的有关数据都会被存储在一个事件对象e里面&#xff0c;这个对象e有许多固定方法提供给我们查看里面各种数据。 二、关于e对象的常用属性介绍 1. e.eventPhase查看事件触发所处的阶…

MySQL索引原理笔记

注意&#xff1a;本博客为个人学习记录&#xff0c;不保证正确性&#xff0c;仅供参考指正 MySQL索引原理以及SQL优化 文章目录MySQL索引原理以及SQL优化索引与约束覆盖索引最左匹配规则索引下推&#xff08;面试重点&#xff09;索引存储索引失效如何解决sql比较慢的问题索引…

【JavaWeb】JSP(172-190)

172.Jsp-什么是jsp&#xff0c;以及它有什么作用 jsp 的全换是 java server pages。Java 的服务器页面。 jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据。 因为 Servlet 程序回传 html 页面数据是一件非常繁锁的事情。开发成本和维护成本都极高。 Servlet 回传 htm…

大白话讲解MySQL 索引,页分裂,行溢出,事务

目录 一、索引 索引是什么&#xff0c;页分裂 页的结构 mysql怎么查询数据 二、页合并 三、行溢出 四、事务 事务四大特性 1、原子性 2、一致性 3、隔离性 4、持久性 事务隔离级别 隔离级别导致的问题 隔离级别与锁的关系 锁与快照读、当前读的关系 RR快照读与…

网页信息采集-网页数据采集方法

随着社会不停的发展。人们也是越来越离不开互联网&#xff0c;今天小编就给大家盘点一下免费的网页信息采集&#xff0c;只需要点几下鼠标就能轻松爬取数据&#xff0c;不管是导出excel还是自动发布到网站都支持。详细参考图片一、二、三、四&#xff01; 企业人员 通过爬取动…

[附源码]计算机毕业设计JAVA创意众筹网站

[附源码]计算机毕业设计JAVA创意众筹网站 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

JavaScript历史上的今天是星期几

前言 &#x1f44f;这个案例有很多点是我之前不知道的&#xff08;因为是小白&#xff09;&#xff0c;所以很值得学习&#xff0c; ✍编程不是打字机&#xff0c;⭐争取明白每个细节&#xff0c;并努力做的更好 步骤 1.html布局&#xff0c;一个下拉菜单&#xff08;如图&…

独家巨献!阿里专家兼Github贡献者业“大师级Dubbo实战笔记”入门到成神

Apache Dubbo是一款RPC服务开发框架&#xff0c;那何为RPC呢&#xff1f;全称为Remote Procedure Call&#xff0c;翻译过来就是远程过程调用。 使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力&#xff0c; 利用 Dubbo 提供的丰富服务治理特性&#xff0c;可…

ZYNQ使用AXI4-HP接口总线读取DDR中的数据

一、前言 最近笔者在做项目的时候需要使用zynq中的AXI4-HP总线在PL端读取DDR中的数据这种功能&#xff0c;但是网上很多历程对于这方面只是创建了一个官方提供的IP核用于测试&#xff0c;并且每次写入和读取的长度为4K字节。所以为了满足我自己的项目需求&#xff0c;笔者将官…

电脑桌面图标不见了怎么回事?正确的找回图标的2个方案

最近遇到很多用户朋友说自己的电脑桌面图标不见了&#xff0c;觉得很奇怪。用户以为是系统原因造成的。电脑桌面图标不见了怎么回事&#xff1f;图标删除了怎么办&#xff1f;这篇文章就给大家分享如何找回电脑桌面消失的图标&#xff0c;一起来看看吧&#xff01; 一、找回电脑…

DTPA PEG 异硫氰酸荧光素,DTPA PEG FITC,FITC-PEG-DTPA

产品名称&#xff1a;DTPA PEG 异硫氰酸荧光素 英文名称&#xff1a;DTPA PEG FITC&#xff0c;FITC-PEG-DTPA CAS&#xff1a;668-000-2 产地&#xff1a;西安 规格&#xff1a;1mg 5mg 10mg 纯度&#xff1a;99% 厂家&#xff1a;西安齐岳生物科技有限公司 用途&#…

arthas的监控java性能

目录1 arthas简介2 arthas下载3 arthas的使用3.1 arthas启动3.2 常用命令3.2.1 dashboard3.2.2 thread3.2.3 jad3.2.4 watch3.2.5 getstatic3.2.6 heapdump3.2.6.1 dump到指定的文件3.2.6.2 dump live 对象3.2.6.3 dump 到临时文件3.2.7 jvm3.2.8 logger3.2.9 mbean3.2.9.1 列出…

Baklib|我的企业是不是需要一个维基页面呢?

你很可能已经听说过维基百科。事实上&#xff0c;我们大多数人几乎每天都在使用维基百科来获取有关历史事件、名人或世界各地的有用信息。但是你知道公司也可以创建和维护他们自己的wiki页面吗? 随着时间的推移&#xff0c;公司会积累大量的信息。如果没有一个好的方法来存储…

Java:为什么要更新Java应用程序?

27年来&#xff0c;Java一直是企业软件开发中最流行的编程语言之一。世界上无数的系统都是使用这种广为人知的语言构建的。 传统的Java应用程序是独一无二的。它们的包中包含了运行应用程序所需的一切&#xff0c;但整体性使得开发人员在进行更改时很难保持敏捷。开发人员必须从…

项目实战——实现注册与登录模块(结尾)

目录 一、整体框架 二、前端页面授权 三、实现注册页面 四、实现登录状态的持久化 一、整体框架 二、前端页面授权 当我们登录网站的时候&#xff0c;如果没有登录&#xff0c;强制让用户重定向到 登录界面 在 router 目录下的 index.js 文件下实现。 router -> index.js…

DIVFusion:首个耦合互促低光增强图像融合的框架

DIVFusion:首个耦合互促低光增强&图像融合的框架DIVFusion:首个耦合互促低光增强&图像融合的框架写在前面问题引入Motivation主要贡献网络架构实验验证融合性能目标检测性能消融实验结论写在最后DIVFusion:首个耦合互促低光增强&图像融合的框架 论文&#xff1a;h…