当前位置: 首页 > 编程日记 > 正文

Android-room的学习

目录

关于ROOM

1.Room有3个主要的组件

2.Room 不同组件之间的关系如图所示

3.导入ROOM(使用 Room 需要添加依赖)

4.(实现数据库操作的步骤)以下代码段包含具有一个实体和一个 DAO 的示例数据库配置

实例demo

1.Student.java

2.StudentDao.java

3.StudentDatabase.java

4.MainActivity.java

5.activity_main.xml

参考资料



关于ROOM

Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。

处理大量结构化数据的应用可极大地受益于在本地保留这些数据。最常见的用例是缓存相关数据。这样,当设备无法访问网络时,用户仍可在离线状态下浏览相应内容。设备之后重新连接到网络后,用户发起的所有内容更改都会同步到服务器。

1.Room有3个主要的组件

  • 数据库:包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点。

    使用 @Database 注释的类应满足以下条件:

    • 是扩展 RoomDatabase 的抽象类。
    • 在注释中添加与数据库关联的实体列表。
    • 包含具有 0 个参数且返回使用 @Dao 注释的类的抽象方法。

    在运行时,您可以通过调用 Room.databaseBuilder() 或 Room.inMemoryDatabaseBuilder() 获取 Database 的实例。

  • Entity:表示数据库中的表。

  • DAO:包含用于访问数据库的方法。

应用使用 Room 数据库来获取与该数据库关联的数据访问对象 (DAO)。然后,应用使用每个 DAO 从数据库中获取实体,然后再将对这些实体的所有更改保存回数据库中。最后,应用使用实体来获取和设置与数据库中的表列相对应的值。

2.Room 不同组件之间的关系如图所示

3.导入ROOM(使用 Room 需要添加依赖

dependencies {def room_version = "2.2.0-alpha01"implementation "androidx.room:room-runtime:$room_version"annotationProcessor "androidx.room:room-compiler:$room_version" // use kapt for Kotlin// optional - RxJava support for Roomimplementation "androidx.room:room-rxjava2:$room_version"// optional - Guava support for Room, including Optional and ListenableFutureimplementation "androidx.room:room-guava:$room_version"// Test helperstestImplementation "androidx.room:room-testing:$room_version"
}

4.(实现数据库操作的步骤)以下代码段包含具有一个实体和一个 DAO 的示例数据库配置

1.User.java (必须先创建一个需要映射的实体类,用@Entity进行注解)

@Entity
public class User {@PrimaryKeyprivate int uid;@ColumnInfo(name = "first_name")private String firstName;@ColumnInfo(name = "last_name")private String lastName;// Getters and setters are ignored for brevity,// but they're required for Room to work.
}

2.UserDao.java( 创建一个操作实体类的dao接口,用@Dao进行注解)

@Dao
public interface UserDao {@Query("SELECT * FROM user")List<User> getAll();@Query("SELECT * FROM user WHERE uid IN (:userIds)")List<User> loadAllByIds(int[] userIds);@Query("SELECT * FROM user WHERE first_name LIKE :first AND "+ "last_name LIKE :last LIMIT 1")User findByName(String first, String last);@Insertvoid insertAll(User... users);@Deletevoid delete(User user);
}

3.AppDatabase.java( 创建一个抽象类,添加@Database注解)

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

4.在创建上面的文件之后,使用以下代码获得创建数据库的实例:

AppDatabase db = Room.databaseBuilder(getApplicationContext(),AppDatabase.class, "database-name").build();

实例demo

1.Student.java

package com.example.applicationroom;import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;@Entity
public class Student {@PrimaryKey(autoGenerate = true) // 设置主键,并且自动生长private int id;@ColumnInfo(name = "username") // 设置别名,如果不设置就默认为变量名private String name;public Student(int id, String name) {this.id = id;this.name = name;}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;}}

2.StudentDao.java

package com.example.applicationroom;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 {// 在这里声明数据库的操作,如增删改查@Insertpublic void insertStudents(Student...students);// 可以传递三个参数@Updatevoid updateStudents(Student...students);@Deletevoid deleteStudents(Student...students);@Query("DELETE FROM STUDENT")void deleteAllStudents();@Query("SELECT * FROM STUDENT ORDER BY id ASC") // 升序排列List<Student> getAllStudents();}

3.StudentDatabase.java

package com.example.applicationroom;import androidx.room.Database;
import androidx.room.RoomDatabase;
@Database(entities = {Student.class}, version = 6, exportSchema = false)
public abstract class StudentDatabase extends RoomDatabase {public abstract StudentDao getStudentDao(); // 若有多个 Entity,则应该写多个 Dao/* private static  StudentDatabase mInstance;public StudentDatabase() { }public static StudentDatabase getsInstance(Context context) {if (mInstance == null) {synchronized (StudentDatabase.class) {if (mInstance == null) {mInstance = Room.databaseBuilder(context.getApplicationContext(),StudentDatabase.class, "StudentDb").fallbackToDestructiveMigration().addMigrations().allowMainThreadQueries().build();}}}return mInstance;}*/}

4.MainActivity.java

package com.example.applicationroom;import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Room;import java.util.List;public class MainActivity extends AppCompatActivity {StudentDatabase studentDatabase;StudentDao studentDao;TextView textView;Button buttonInsert,buttonUpdate,buttonDelete,buttonClear;@Overrideprotected void onCreate(Bundle savedInstanceState)  {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.textView);// allowMainThreadQueries() 强制允许在主线程执行,真实开发中不要这么做//studentDatabase = StudentDatabase.getsInstance(this);//studentDao = studentDatabase.studentDao();// allowMainThreadQueries() 强制允许在主线程执行,真实开发中不要这么做studentDatabase = Room.databaseBuilder(this,StudentDatabase.class,"word_database").allowMainThreadQueries().build();studentDao = studentDatabase.getStudentDao();updateView();buttonInsert = findViewById(R.id.buttonInsert);buttonUpdate = findViewById(R.id.buttonUpdate);buttonDelete = findViewById(R.id.buttonDelete);buttonClear = findViewById(R.id.buttonClear);buttonInsert.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Student student1 = new Student(1,"吴美丽");Student student2 = new Student(2,"张漂亮");studentDao.insertStudents(student1,student2);updateView();}});buttonClear.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {studentDao.deleteAllStudents();updateView();}});buttonUpdate.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Student student3= new Student(3,"马可爱");studentDao.updateStudents(student3);updateView();}});buttonDelete.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Student student = new Student(0,"");studentDao.deleteStudents(student);updateView();}});}void updateView(){List<Student> list = studentDao.getAllStudents();String text = "";for(int i = 0; i < list.size(); i++){Student student= list.get(i);text += student.getId() + ":" + student.getName()  + "\n";}textView.setText(text);}
}

5.activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.constraintlayout.widget.Guidelineandroid:id="@+id/guideline"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"app:layout_constraintGuide_begin="188dp" /><ScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"tools:layout_editor_absoluteX="-16dp"tools:layout_editor_absoluteY="51dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><Buttonandroid:id="@+id/buttonUpdate"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="UPDATE" /><Buttonandroid:id="@+id/buttonInsert"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="INSERT" /><Buttonandroid:id="@+id/buttonDelete"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="DELETE" /><Buttonandroid:id="@+id/buttonClear"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="CLEAR" /><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="TextView" /></LinearLayout></ScrollView></androidx.constraintlayout.widget.ConstraintLayout>

       

图一:插入数据

图二:清空数据

保存的数据库文件,可以在存储中找到,如图:

参考资料:

使用 Room 将数据保存到本地数据库

【Android-Room数据库系列】—— Room 基础

相关文章:

JDK5中的控制台输入

Scanner类是JDK5新添加的一个类&#xff0c;主要作用是处理输入流、文件和文本内容等 。这个类在java.util包里面&#xff0c;实现了Iterator接口&#xff0c;而且io处理采用了jdk1.4才发布的nio。由于这个类实现了Iterator接口&#xff0c;如果全部是string的话&#xff0c;就…

[BZOJ3779]重组病毒(LCT+DFS序线段树)

同[BZOJ4817]树点涂色&#xff0c;只是多了换根操作&#xff0c;分类讨论下即可。 1 #include<cstdio>2 #include<algorithm>3 #define lc ch[x][0]4 #define rc ch[x][1]5 #define ls (x<<1)6 #define rs (ls|1)7 #define lson ls,L,mid8 #define rson rs,m…

UVA - 1594 Ducci Sequence

/*做这题时的心路历程其实挺有趣的一开始看到说Ducci序列最终要么全0&#xff0c;要么循环&#xff0c;我在想&#xff1a;要怎么判断循环呢&#xff1f;是不是还得记录下循环节什么的&#xff1f;是该用数组记录循环节吗&#xff1f;还是想要让我们利用STL来记录&#xff1f;后…

RTF密码破解

有一个RTF文件带密码&#xff0c;用文本编辑器察看&#xff0c;有类似“password”字样。为了编辑它&#xff0c;有两个方法&#xff1a; 1、用word2000打开该文件&#xff0c;Tools--〉Unprotect Document&#xff0c;执行后&#xff0c;文件就可以正常编辑了。如果有多个文件…

Android 数据存储-内外部存储测试

案例分析&#xff1a;FilePersistenceTest 在EditText中输入文本内容&#xff0c;退出应用程序或者 单击“保存”按钮时 保存EditText中的数据到名 为“data”的文件中。 打开Device File Explorer&#xff0c;该文件应该存于 /data/data/cn.edu.hunnu.filepersistencetest/…

微软以后要是也开源也免费,java还竞争过.NET吗?

上次参加招聘会&#xff0c;看得到好多大公司都要求精通java&#xff0c;可惜上大学大一就学了.NET,而java到大三才开&#xff0c;并且草草地只讲了些基本知识。有时我就在想难道学当初选择.NET真的错了吗&#xff1f;java确实比.NET存在很多优势。开源、跨平台、免费、开发工具…

Android Studio开发环境及第一个项目

1. 在你的电脑上搭建Android平台开发环境。 2. 新建项目&#xff0c;实现以下基本内容&#xff1a; (1) 修改默认的APP的名称和图标&#xff08;任意的&#xff0c;非默认的&#xff09;。 (2) 显示个人信息&#xff0c;包括&#xff1a;照片、专业、姓名、学号等基本信息。…

去除inline-block元素间距

转载于:https://www.cnblogs.com/keepitreal/p/10301199.html

C#ListView控件添加Checkbox复选框并获取选中的数目,检查checkbox是否勾选

[转载]原地址&#xff1a;http://blog.csdn.net/lucky51222/article/details/41892429 具体方法 1、添加复选框 并且如下设置 listView1.CheckBoxes true; 2、选中listview并获取选中的数目&#xff1a; 具体代码 private void listView1_ItemChecked(object sender, ItemChec…

weblogic学习笔记(1)

weblogic安装、配置和启动 1、weblogic安装转载于:https://blog.51cto.com/pengchenga/66424

react 从使用 看定义

如果你创建了一个类似元素做出反应Twitter的下面&#xff0c;你会的组件定义Twitter的样子&#xff1f; <Twitter usernametylermcginnis33>{(user) > user null? <Loading />: <Badge info{user} />} </Twitter> import React, { Component, Pro…

Android 活动与活动间数据传递

实验内容 综合运用基本组件完成一个注册与登录的应用程序设计。要求基于基础控件&#xff0c;综合使用Intent实现Android的Activity之间信息交换。系统包含启动页、注册页、登录页3个页面&#xff0c;具体要求如下&#xff1a; 1.注册页面和功能的实现。 –界面要求包含用户…

Selenium-js弹窗浮层

学习过js的小伙伴会发现&#xff0c;我们在一些实例中用到了alert()方法、prompt()方法、prompt()方法&#xff0c;他们都是在屏幕上弹出一个对话框&#xff0c;并且在上面显示括号内的内容&#xff0c;使用这种方法使得页面的交互性更精彩&#xff0c;实际上我们经常会在进行网…

JAVA基础(JAVA 执行环境) 第一天

JAVA程序有3中执行环境。 &#xff08;1&#xff09;能够单独运行的程序&#xff0c;称为Java Application(Java应用程序)。 &#xff08;2&#xff09;在Internet浏览器中运行的程序&#xff0c;称为 Java Applet&#xff08;JAVA小用用程序&#xff09;。Applet是一个在WEB浏…

ERP图形目录

这些天正在研究ERP&#xff0c;老师要求我们自己制作一个ERP出来。找了不少资料&#xff0c;就这个图形目录比较有学习价值。这个图形目录是PDF文件&#xff0c;包括销售管理、采购管理、库存管理、制作标准管理、计划管理、车间管理、JIT生产管理、质量管理、财务管理、人力资…

JSP学习笔记(五):日期处理、页面重定向、点击量统计、自动刷新和发送邮件...

一、JSP 日期处理&#xff1a; 使用JSP最重要的优势之一&#xff0c;就是可以使用所有Java API。本节讲述Java中的Date类&#xff0c;它在java.util包下&#xff0c;封装了当前日期和时间。 Date类有两个构造函数。第一个构造函数使用当前日期和时间来初始化对象&#xff1a;D…

完善登录注册页面

实验内容 综合运用基本组件完成一个注册与登录的应用程序设计。要求基于基础控件&#xff0c;综合使用Intent实现Android的Activity之间信息交换。系统包含启动页、注册页、登录页3个页面&#xff0c;具体要求如下&#xff1a; 在第2周上机作业的基础上&#xff0c;完善登录注…

EF 批量 添加 修改 删除

1批量添加 db.T_Investigator.AddRange(list) 2批量删除 db.T_Investigator.RemoveRange(list) 3批量修改 for 循环修改。 注意&#xff1a; 先查询出来&#xff0c;最后savechange&#xff08;&#xff09;&#xff0c;写在一个事务中&#xff0c;一次请求一个上下文。…

在IE7中无效的解决办法

通过ShowModalDialog 打开页面,在POSTBACK时,打开新的页面&#xff0c; 在IE6下没问题,只有在IE7下,会重新打开一新页面&#xff0c; 其实只要把<base target"_self"/> 放到 <head>下即可。 <head> <base target"_self"/> …

简单的纹理管理器

简单的纹理管理器 罗朝辉 (http://www.cnblogs.com/kesalin/)本文遵循“署名-非商业用途-保持一致”创作公用协议游戏中的资源一般都是由资源管理器来处理的&#xff0c;资源管理器负责载入&#xff0c;释放&#xff0c;以及根据资源ID返回相关资源供游戏程序使用。下面改写sph…

记住密码以及Android 列表的操作

1.综合使用RecycleView&#xff0c;CardView&#xff0c;Adapter实现一个宝宝相册&#xff0c;并将其加入到实验一形成的应用中&#xff0c;使得&#xff1a;用户成功登录后转到宝宝相册所在的主界面。还要求实现&#xff1a;用户单击对应的列表子项的不同部位时给出不同的Toas…

python-----利用filecmp删除重复文件

以下代码素材自取&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1fL17RjKyGjpvpeeUFONCaQ 提取码&#xff1a;zgiw # coding:utf-8 import os import filecmp# 将指定目录下的所有文件的路径存储到all_files变量中 def get_all_files(path, dirs):all_files []for d …

如何设置REUSE_ALV_GRID_DISPLAY'的单个单元格的是否可以输入

代码如下&#xff1a;具体说明参见红色说明(本例子是从订单明细提取两个字段的数据到内表) REPORT ZALV_EDIT.TYPE-POOLS: SLIS.*- FieldcatalogDATA: IT_FIELDCAT TYPE LVC_T_FCAT.DATA: X_FIELDCAT TYPE LVC_S_FCAT.DATA: X_LAYOUT TYPE LVC_S_LAYO. "第1步&#xff1a;…

记一次生产的bug

第一个在代码中使用 new SimpleDateFormat("EEEE")来判断周几。在本地测试过程中通过日志打印出来的周几 比如周日对应的是中文汉字“星期日”&#xff0c;然后使用判断 if("星期日".equals(weekDay)){ } (其中weekDay是要使用的日期)。在本地测试通过后…

企业ERP制度的“执行力”

一直都很想说这个话题。可能很多人不是太理解这个标题&#xff0c;企业ERP制度是指完成了ERP系统实施的企业&#xff0c;为了维持ERP系统的持续运行而建立的ERP运行制度。执行力就不用多说了&#xff0c;就是ERP运行制度到底执行了多少&#xff0c;怎么执行的问题。许多管理软件…

python学习点滴记录-Day10-线程

多线程 协程 io模型 并发编程需要掌握的点&#xff1a; 1 生产者消费者模型2 进程池线程池3 回调函数4 GIL全局解释器锁 线程 理论部分 &#xff08;摘自egon老师博客&#xff09; 一、定义&#xff1a; 在传统操作系统中&#xff0c;每个进程有一个地址空间&#xff0c;而且默…

适配设备的简易新闻浏览器

同时兼容手机和平板。 进入应用后先显示新闻列表&#xff0c;当在手机上使用时&#xff0c;使用单页模式&#xff0c;单击列表项会打开新的页面。 当在平板上使用时&#xff0c;使用双页模式&#xff0c;单击左侧列表项时直接更新右侧新闻内容页。 MainActivity.java pack…

this.$router.push、replace、go的区别

1.this.$router.push() 描述&#xff1a;跳转到不同的url&#xff0c;但这个方法会向history栈添加一个记录&#xff0c;点击后退会返回到上一个页面。 用法&#xff1a; 2.this.$router.replace() 描述&#xff1a;同样是跳转到指定的url&#xff0c;但是这个方法不会向histor…

jQuery 实现图片的特效1[原]

用jQuery实现图片的动画效果非常简单.以下演示 jQuery里面所用到的参数 HIDE SHOW FADEOUT FADEIN 的不同. 在线演示:单击演示 代码分析: //hide and show fadeout and fadein $("input:eq(0)").click(function(){ $("img").fadeOut(3000); }); …

【设计模式】 模式PK:策略模式VS状态模式

1、概述 行为类设计模式中&#xff0c;状态模式和策略模式是亲兄弟&#xff0c;两者非常相似&#xff0c;我们先看看两者的通用类图&#xff0c;把两者放在一起比较一下。 策略模式&#xff08;左&#xff09;和状态模式&#xff08;右&#xff09;的通用类图。 两个类图非常相…