Android : Room 数据库的基本用法 _简单应用_二_优化

1.导入依赖 build.gradle

dependencies {//Roomdef room_version = "2.5.0"implementation "androidx.room:room-runtime:$room_version"annotationProcessor "androidx.room:room-compiler:$room_version"// 使用androidx版本库  ViewModelProvidersimplementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha03'
}

2.PeopleDAtaBase.java 修改 为单例:

package com.example.myroom.dao;import android.content.Context;import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;import com.example.myroom.entity.People;/** 优化 改成单例模式 singleton
抽象类 继承 RoomDatabase      我们不用实现people中的方法version = 1 版本号,exportSchema = false不允许导出数据库的架构*/
@Database(entities = {People.class}, version = 1, exportSchema = false)
public abstract class PeopleDataBase extends RoomDatabase {private static PeopleDataBase peopleDataBase;public static synchronized PeopleDataBase getPeopleDataBase(Context context){if(peopleDataBase == null){peopleDataBase = Room.databaseBuilder(context.getApplicationContext(),PeopleDataBase.class,"peopleDB")
// 默认不允许在主线程中连接数据库   在主线程中处理  使用了异步任务AsyncTask
//                    .allowMainThreadQueries().build();}return peopleDataBase;}/**
* Java 抽象类的一些特点
* 不能被实例化:抽象类不能被实例化,因为它没有具体的实现细节。它只能被继承,并且子类必须实现抽象类中的所有抽象方法。
* 包含抽象方法:抽象类可以包含抽象方法,这些方法只有声明但没有实现。子类必须实现这些抽象方法,否则它也必须被声明为抽象类。
* 提供通用功能和行为:抽象类提供了一些通用功能和行为,这些功能和行为可以被其子类继承和重用。子类可以根据需要扩展这些功能和行为,或者重写它们以提供不同的实现。
* 用于设计高层次的抽象:抽象类可以用于表示一个高层次的抽象概念或者一个通用模板,使得代码更加模块化和可维护。通过将一些公共方法和行为提取到一个抽象类中,可以避免在多个子类中重复实现相同的功能。
* 扩展性:抽象类可以定义一些扩展的接口,子类可以选择实现这些接口来提供额外的功能。这使得抽象类具有很好的扩展性,可以根据需要添加新的功能和行为
*/public abstract  PeopleDao peopleDao();}

3.添加异步任务 AsyncTask

3.1保存数据方法:InsertAsyncTask .java

package com.example.myroom.task;import android.os.AsyncTask;import com.example.myroom.dao.PeopleDao;
import com.example.myroom.entity.People;
/** AsyncTask 在 API 级别 30 中此字段已弃用 , 请改用标准或 Kotlin 并发实用程序* 插入数据 异步任务*	android.os.AsyncTask<Params、进度、结果>* */
public class InsertAsyncTask extends AsyncTask<People,Void,Void> {/*** 4个步骤* 执行异步任务时,任务会经历 4 个步骤:** onPreExecute(),在任务之前的 UI 线程上调用 被执行。此步骤通常用于设置任务,例如 在用户界面中显示进度条。** doInBackground(Params),在后台线程上调用 执行完毕后立即执行。* 此步骤用于 执行可能需要很长时间的后台计算。参数 的异步任务被传递到此步骤。* 计算结果必须 由此步骤返回,并将传递回最后一步。这一步 还可用于发布一个或多个单元 的进步。* 这些值在步骤中发布在 UI 线程上。onPreExecute()publishProgress(Progress)onProgressUpdate(Progress)** onProgressUpdate(Progress),在 UI 线程上调用 调用 。* 执行的时间是 定义。此方法用于在用户中显示任何形式的进度 接口,而后台计算仍在执行。* 例如 它可用于对进度条进行动画处理或在文本字段中显示日志。publishProgress(Progress)** onPostExecute(Result),在后台之后的 UI 线程上调用 计算完成。将后台计算的结果传递给主界面。* */private PeopleDao peopleDao;public InsertAsyncTask(PeopleDao peopleDao){this.peopleDao=peopleDao;}@Overrideprotected Void doInBackground(People... people) {//在后台执行 插入数据操作peopleDao.insertDataS(people);return null;}
}

3.2删除数据方法:DeleteAsyncTask .java

package com.example.myroom.task;import android.os.AsyncTask;import com.example.myroom.dao.PeopleDao;
import com.example.myroom.entity.People;public class DeleteAsyncTask extends AsyncTask<People,Void,Void> {private PeopleDao peopleDao;public DeleteAsyncTask(PeopleDao peopleDao){this.peopleDao = peopleDao;}@Overrideprotected Void doInBackground(People... people) {peopleDao.deleteDataS(people);return null;}
}

3.3 删除表数据方法 DeleteTBAsyncTask .java

package com.example.myroom.task;import android.os.AsyncTask;import com.example.myroom.dao.PeopleDao;public class DeleteTBAsyncTask extends AsyncTask<Void,Void,Void> {private PeopleDao peopleDao;public DeleteTBAsyncTask(PeopleDao peopleDao) {this.peopleDao = peopleDao;}@Overrideprotected Void doInBackground(Void... voids) {peopleDao.deleteTableData();return null;}
}

3.4 根据id查询数据方法 SelectByIdAsyncTask .java

package com.example.myroom.task;import android.os.AsyncTask;import com.example.myroom.dao.PeopleDao;
import com.example.myroom.entity.People;public class SelectByIdAsyncTask extends AsyncTask<Integer,Void,People> {private PeopleDao peopleDao;public SelectByIdAsyncTask(PeopleDao peopleDao) {this.peopleDao = peopleDao;}@Overrideprotected People doInBackground(Integer... integers) {People people =peopleDao.getPeople(integers[0]);return people;}
}

3.5 更新数据方法 UpdateAsyncTask .java

package com.example.myroom.task;import android.os.AsyncTask;import com.example.myroom.dao.PeopleDao;
import com.example.myroom.entity.People;public class UpdateAsyncTask extends AsyncTask<People,Void,Void> {private PeopleDao peopleDao;public UpdateAsyncTask( PeopleDao peopleDao){this.peopleDao = peopleDao;}@Overrideprotected Void doInBackground(People... people) {peopleDao.updateData(people);return null;}
}

4.修改PeopleDao.java

@Dao
public interface PeopleDao {...//查询 根据id倒序@Query("select * from people order by id desc")LiveData<List<People>> getPeopleLive(); //设置成为可以观察的数据 LiveDAta//    List<People> getPeoples();...
}

5.创建仓库 PeopleRepository.java

package com.example.myroom.dao;import android.content.Context;
import android.util.Log;import androidx.lifecycle.LiveData;import com.example.myroom.entity.People;
import com.example.myroom.task.DeleteAsyncTask;
import com.example.myroom.task.DeleteTBAsyncTask;
import com.example.myroom.task.InsertAsyncTask;
import com.example.myroom.task.SelectByIdAsyncTask;
import com.example.myroom.task.UpdateAsyncTask;import java.util.List;public class PeopleRepository {PeopleDao peopleDao;LiveData<List<People>> allPeopleLive;public PeopleRepository(Context context) {PeopleDataBase peopleDataBase = PeopleDataBase.getPeopleDataBase(context.getApplicationContext());peopleDao = peopleDataBase.peopleDao();allPeopleLive = peopleDao.getPeopleLive();}public LiveData<List<People>> getAllPeopleLive() {return allPeopleLive;}public void insertPeoples(People... people) {new InsertAsyncTask(peopleDao).execute(people);}public void updatePeoples(People... people) {new UpdateAsyncTask(peopleDao).execute(people);}public void deletePeople(People... people) {new DeleteAsyncTask(peopleDao).execute(people);}public void deleteTBPeoples() {new DeleteTBAsyncTask(peopleDao).execute();}public People selectPeopleById(Integer id) {People people = null;try {people = new SelectByIdAsyncTask(peopleDao).execute(id).get();} catch (Exception e) {Log.e("TAG", "根据id查询失败" + e.getMessage());}return people;}}

6.创建MyViewModel .java  

package com.example.myroom;import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import com.example.myroom.dao.PeopleDao;
import com.example.myroom.dao.PeopleRepository;
import com.example.myroom.entity.People;import java.util.List;//管理界面数据
public class MyViewModel extends AndroidViewModel {private PeopleDao peopleDao;private PeopleRepository peopleRepository;public MyViewModel(@NonNull Application application) {super(application);peopleRepository = new PeopleRepository(application);}public LiveData<List<People>> getAllPeopleLive() {return peopleRepository.getAllPeopleLive();}public void insertPeoples(People... people){peopleRepository.insertPeoples(people);}public void updatePeoples(People... people){peopleRepository.updatePeoples(people);}public void deletePeople(People... people){peopleRepository.deletePeople(people);
//        new DeleteAsyncTask(peopleDao).execute(people);}public void deleteTBPeoples(){peopleRepository.deleteTBPeoples();}public People selectPeopleById(Integer id){return peopleRepository.selectPeopleById(id);}}

7.MainActivity.java

package com.example.myroom;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import com.example.myroom.dao.PeopleDao;
import com.example.myroom.dao.PeopleDataBase;
import com.example.myroom.entity.People;
import com.example.myroom.task.DeleteTBAsyncTask;import java.util.List;public class MainActivity extends AppCompatActivity {PeopleDataBase DB;PeopleDao peopleDao;MyViewModel myViewModel;private Button btnInsert, btnDelete, btnUpdate, btnSelect, btnDeleteData;private TextView textContent;private EditText etName, etAge, etSex, etSelect, etDelete, etUpdate;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
//        binding = DataBindingUtil.setContentView(this,R.layout.activity_main);textContent = findViewById(R.id.tvcontent);etName = findViewById(R.id.etName);etAge = findViewById(R.id.etAge);etSex = findViewById(R.id.etSex);etSelect = findViewById(R.id.etSelect);etDelete = findViewById(R.id.etDelete);etUpdate = findViewById(R.id.etUpdate);btnInsert = findViewById(R.id.btnSave);btnDelete = findViewById(R.id.btnDelete);btnUpdate = findViewById(R.id.btnUpdate);btnSelect = findViewById(R.id.btnselect);btnDeleteData = findViewById(R.id.btnDeleteTB);myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);DB = PeopleDataBase.getPeopleDataBase(this);peopleDao = DB.peopleDao();//观察数据myViewModel.getAllPeopleLive().observe(this, new Observer<List<People>>() {@Overridepublic void onChanged(List<People> peoples) {//内容发生改变执行执行下面代码StringBuilder text = new StringBuilder();for (int i = 0; i < peoples.size(); i++) {People people = peoples.get(i);text.append("id:").append(people.getId()).append("---name:").append(people.getName()).append("---age:").append(people.getAge()).append("---sex:").append(people.getSex()).append("\n");}textContent.setText(text.toString());}});
//        //查询数据
//        selectData(null);//按钮事件 插入数据btnInsert.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//插入数据 防止空String name = etName.getText().toString().equals("") ? "张三" : etName.getText().toString();int age = etAge.getText().toString().equals("") ? 20 : Integer.parseInt(etAge.getText().toString());String sex = etSex.getText().toString().equals("") ? "男" : etSex.getText().toString();People people = new People(name, age, sex);myViewModel.insertPeoples(people);//                new InsertAsyncTask(peopleDao).execute(people);//                DB.peopleDao().insertDataS(people);//查询数据
//                selectData(null);}});//修改数据btnUpdate.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//修改int id = etUpdate.getText().toString().equals("") ? 0 : Integer.parseInt(etUpdate.getText().toString());if (id != 0) {String name = etName.getText().toString();int age = Integer.parseInt(etAge.getText().toString());String sex = etSex.getText().toString();People people = new People(name, age, sex);people.setId(id);myViewModel.updatePeoples(people);//                    new UpdateAsyncTask(peopleDao).execute(people);
//                    DB.peopleDao().updateData(people);//查询
//                    selectData(null);}}});//删除btnDelete.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int id = etDelete.getText().toString().equals("") ? 0 : Integer.parseInt(etDelete.getText().toString());if (id != 0) {People people = new People();people.setId(id);myViewModel.deletePeople(people);//                    new DeleteAsyncTask(peopleDao).execute(people);
//                    DB.peopleDao().deleteDataS(people);//查询
//                    selectData(null);}}});//根据id 查数据btnSelect.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int id = etSelect.getText().toString().equals("") ? 0 : Integer.parseInt(etSelect.getText().toString());if (id != 0) {selectDataById(id);}}});//删除全部数据btnDeleteData.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {
//                DB.peopleDao().deleteTableData();new DeleteTBAsyncTask(peopleDao).execute();}});}/*** 查询数据的方法*/public void selectDataById(Integer id) {try {StringBuilder text = new StringBuilder();
//                People people = DB.peopleDao().getPeople(id);
//            People people = new SelectByIdAsyncTask(peopleDao).execute(id).get();People people = myViewModel.selectPeopleById(id);text.append("id:").append(people.getId()).append("---name:").append(people.getName()).append("---age:").append(people.getAge()).append("---sex:");textContent.setText(text.toString());} catch (Exception e) {Log.e("TAG", "----查询失败------------" + e.getMessage());}}}

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

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

相关文章

LLM之RAG实战(四):Self-RAG如何革命工业LLM

论文地址&#xff1a;https://arxiv.org/pdf/2310.11511.pdf Github地址&#xff1a;https://github.com/AkariAsai/self-rag 尽管LLM&#xff08;大型语言模型&#xff09;的模型和数据规模不断增加&#xff0c;但它们仍然面临事实错误的问题。现有的Retrieval-Augmented Gen…

js中严格模式简单介绍

ES5中增加了一种运行模式 &#xff0c;严格模式。严格模式使代码在更严格的条件下运行&#xff0c;以消除一些JavaScript中语法不合理及怪异之处。但是在严格模式下有一些语句及语法是不能使用的&#xff0c;比如delete只能删除属性描述符中configurable设置为true的对象 属性…

一文讲清 QWidget 大小位置

一文讲清 QWidget 大小位置 前言 ​ QWidget 的位置基于桌面坐标系&#xff0c;以左上角为原点&#xff0c;向右x轴增加&#xff0c;向下y轴增加。 一、图解 ​ ​ 如上图所示&#xff0c;当窗口为顶层窗口时&#xff08;即没有任何父窗口&#xff09;&#xff0c;系统会自…

JVM的五大分区

1.方法区 方法区主要用来存储已在虚拟机加载的类的信息、常量、静态变量以及即时编译器编译后的代码信息。该区域是被线程共享的。 2.虚拟机栈 虚拟机栈也就是我们平时说的栈内存&#xff0c;它是为java方法服务的。每个方法在执行的 时候都会创建一个栈帧&#xff0c;用于存…

数据结构学习 12字母迷宫

dfs 回溯 剪枝 这个题和dfs有关&#xff0c;但是我之前没有接触过&#xff0c;我看了这一篇很好的文章&#xff0c;看完之后写的答案。 我觉得很好的总结&#xff1a; dfs模板 int check(参数) {if(满足条件)return 1;return 0; }void dfs(int step) {判断边界{相应操作}尝试…

【JUC】二十九、synchronized锁升级之轻量锁与重量锁

文章目录 1、轻量锁2、轻量锁的作用3、轻量锁的加锁和释放4、轻量级锁的代码演示5、重量级锁6、重量级锁的原理7、锁升级和hashcode的关系8、锁升级和hashcode关系的代码证明9、synchronized锁升级的总结10、JIT编译器对锁的优化&#xff1a;锁消除和锁粗化11、结语 &#x1f4…

基士得耶速印机印件故障解决方法和印刷机使用注意事项

基士得耶和理光两个品牌的一体化速印机同属于理光公司的两个不同品牌。基士得耶速印机的每个机型&#xff0c;都有和它通用的理光速印机的机型相对应。&#xff08;油墨版纸通用&#xff0c;外观一样&#xff0c;配件全部通用。&#xff09;速印机在印刷的时候&#xff0c;经常…

USB2.0 Spec 中文篇

体系简介 线缆 USB 是一种支持热拔插的高速串行传输总线&#xff0c;使用一对&#xff08;两根&#xff09;差分信号来传输数据&#xff0c;半双工。要求使用屏蔽双绞线。 供电 USB 支持 “总线供电” 和 “自供电” 两种供电模式。在总线供电方式下&#xff0c;设备最多可…

​subprocess --- 子进程管理​

源代码: Lib/subprocess.py subprocess 模块允许你生成新的进程&#xff0c;连接它们的输入、输出、错误管道&#xff0c;并且获取它们的返回码。此模块打算代替一些老旧的模块与功能&#xff1a; os.system os.spawn*在下面的段落中&#xff0c;你可以找到关于 subprocess 模…

代理模式

接口 public interface UserService {void selectAll(); }实现类&#xff08;需要增加业务&#xff09; public class UserServiceImpl implements UserService{Overridepublic void selectAll() {System.out.println("查询");} }静态代理 代理类 public class Us…

选择适合微服务的编程语言

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 讨论编程语言就像是一场政治辩论。每个开发者都会过分捍卫他/她所使用的编程语言。然而&#xff0c;编程语言应该被看作是它们真…

Tofu目标识别跟踪模块

Tofu3 是多波段视频物体识别跟踪模块&#xff0c;支持可见光视频与红外视频的输入&#xff0c;支持激光补光变焦自适应控制&#xff0c;支持视频下的多类型物体检测、识别、跟踪等功能。 产品支持视频编码、设备管理、目标检测、深度学习识别、跟踪等功能&#xff0c;提供多机…

IPv6网络协议有什么用

IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写&#xff0c;是互联网工程任务组&#xff08;IETF&#xff09;设计的用于替代IPv4的下一代IP协议&#xff0c;号称可以为全世界的每一粒沙子编上一个地址。IPv6的使用&#xff0c;不仅…

一起看看StatusBarManagerService(三)

写在前面 StatusBarManagerService中API涉及systemui的多个模块&#xff1b;本篇主要介绍StatusBarManagerService中与通知栏相关的API和几个通用API。 因为我对系统UI了解的不全&#xff0c;其他API暂不整理&#xff0c;怕误人子弟。。 通知栏相关函数解析 1.展开通知栏 vo…

智慧灯杆技术应用分析

智慧灯杆是指在传统灯杆的基础上&#xff0c;通过集成多种先进技术实现城市智能化管理的灯杆。智慧灯杆技术应用的分析如下&#xff1a; 照明功能&#xff1a;智慧灯杆可以实现智能调光、时段控制等功能&#xff0c;根据不同的需求自动调节照明亮度&#xff0c;提高照明效果&am…

如何测试Nginx防盗链是否生效?

1、查看Nginx防盗链规则是否正确 打开Nginx的配置文件&#xff0c;找到防盗链规则。一般Nginx防盗链的规则内容大致如下&#xff1a; location ~* \.(jpg|jpeg|png|gif)$ {valid_referers none blocked example.com;if ($invalid_referer) {return 403;}} 上述配置会拦截所…

利用Pytorch预训练模型进行图像分类

Use Pre-trained models for Image Classification. # This post is rectified on the base of https://learnopencv.com/pytorch-for-beginners-image-classification-using-pre-trained-models/# And we have re-orginaized the code script.预训练模型(Pre-trained models)…

c++标识线程

c标识线程 线程ID类型为std::thread::id&#xff0c;它有两种方式获取。 直接通过std::thread对象的成员函数get_id()来获取。如果thread对象没有与任何执行线程相关联&#xff0c;get_id()将返回std::thread::id对象&#xff0c;它按照默认的构造方式生成&#xff0c;表示线程…

大型科技公司与初创公司:选择哪一个?

你有没有想过&#xff0c;特别是在你职业生涯的开始&#xff0c;选择什么类型的公司&#xff1f;它应该是一家像谷歌、亚马逊、Meta 这样的大型科技公司&#xff0c;还是为一家小型初创公司工作。在本文中&#xff0c;我们将讨论实际差异是什么&#xff0c;并帮助你选择最适合你…

『OPEN3D』1.8.3 多份点云配准

多份点云配准是将多份点云数据在全局空间中对齐的过程。通常,输入是一组数据(例如点云或RGBD图像){Pi}。输出是一组刚性变换{Ti},使得经过变换的点云在全局空间中对齐。 NNNNNathan 本专栏地址: https://blog.csdn.net/qq_41366026/category_12186023.html 此处是…