当前位置:   article > 正文

Android : Room 数据库的基本用法 —简单应用_一_入门_android room

android room

1.Room介绍:

Android Room 是 Android 官方提供的一个持久性库,用于在 Android 应用程序中管理数据库。它提供了一个简单的 API 层,使得使用 SQLite 数据库变得更加容易和方便。

以下是 Android Room 的主要特点:

  1. 对象关系映射 (ORM):Room 允许您将 Java 或 Kotlin 对象映射到数据库表中。您可以定义数据模型并使用注解来定义关系和约束。
  2. 事务管理:Room 提供了事务管理的功能,可以确保数据的完整性和一致性。它还支持自动提交和回滚机制,类似于 JDBC 中的事务管理。
  3. 数据库抽象:Room 提供了一个抽象层,使得您可以使用简单的 API 来执行 SQL 查询和操作数据库。您不需要编写手动的 SQL 语句,而是使用 Java 或 Kotlin 的查询 API。
  4. 同步和异步操作:Room 支持同步和异步操作,使得您可以轻松地在后台线程中执行数据库操作,以避免阻塞主线程。
  5. 数据库迁移:当您的应用程序更新时,可能需要更改数据库模式。Room 可以自动处理迁移过程,确保数据的一致性和完整性。
  6. 并发支持:Room 支持多线程并发操作,可以有效地处理多个并发请求。
  7. 嵌入式数据库:Room 支持嵌入式数据库,这意味着您可以将数据库文件嵌入到您的应用程序中,而不需要单独安装和管理 SQLite 数据库。
  8. 支持跨平台:除了 Android 平台,Room 还支持 iOS 和桌面应用程序。

总之,Android Room 是一个功能强大的持久性库,使得管理 SQLite 数据库变得更加简单和方便。它提供了一个对象关系映射层、事务管理、数据库抽象等功能,可以帮助您更轻松地构建和管理 Android 应用程序中的数据库。

2.Room使用:

使用教程: Room  |  Jetpack  |  Android Developers

开发文档:androidx.room  |  Android Developers

1.导入依赖:在build.gradle文件中加入

  1. dependencies {
  2. //Room
  3. def room_version = "2.5.0"
  4. implementation "androidx.room:room-runtime:$room_version"
  5. annotationProcessor "androidx.room:room-compiler:$room_version"
  6. }

2.创建实体类 People.java

  1. package com.example.myroom.entity;
  2. import androidx.room.ColumnInfo;
  3. import androidx.room.Entity;
  4. import androidx.room.PrimaryKey;
  5. //实体类 表名 不写默认内名首字母小写 people
  6. @Entity(tableName = "people")
  7. public class People {
  8. //主键 自动生成
  9. @PrimaryKey(autoGenerate = true)
  10. private int id;
  11. //列的名称
  12. @ColumnInfo(name = "user_name")
  13. private String name;
  14. //不写默认列的名称为age,sex
  15. private int age;
  16. private String sex;
  17. public People(String name, int age, String sex) {
  18. this.name = name;
  19. this.age = age;
  20. this.sex = sex;
  21. }
  22. public void setId(int id) {
  23. this.id = id;
  24. }
  25. public int getId() {
  26. return id;
  27. }
  28. public String getName() {
  29. return name;
  30. }
  31. public void setName(String name) {
  32. this.name = name;
  33. }
  34. public int getAge() {
  35. return age;
  36. }
  37. public void setAge(int age) {
  38. this.age = age;
  39. }
  40. public String getSex() {
  41. return sex;
  42. }
  43. public void setSex(String sex) {
  44. this.sex = sex;
  45. }
  46. }

3.创建一个接口Dao  PeopleDao.java

  1. package com.example.myroom.dao;
  2. import androidx.room.Dao;
  3. import androidx.room.Delete;
  4. import androidx.room.Insert;
  5. import androidx.room.Query;
  6. import androidx.room.Update;
  7. import com.example.myroom.entity.People;
  8. import java.util.List;
  9. //dao database access object 接口 处理数据库的方法签名
  10. @Dao
  11. public interface PeopleDao {
  12. //添加 传递一个参数 对象
  13. @Insert
  14. void insertDataOne(People people);
  15. //添加 可以传递多个参数 对象
  16. @Insert
  17. void insertDataS(People... people);
  18. //删除
  19. @Delete
  20. int deleteDataS(People... people);
  21. //修改 传入对象 设置 id 进行修改某一个
  22. @Update
  23. int updateData(People... people);
  24. //查询 根据id倒序
  25. @Query("select * from people order by id desc")
  26. List<People> getPeoples();
  27. //根据id查询
  28. @Query("select * from people where id =:numb")
  29. People getPeople(Integer numb);
  30. //删除表数据
  31. @Query("delete from people")
  32. void deleteTableData();
  33. }

4.写个抽象类继承RoodDatabase

  1. package com.example.myroom.dao;
  2. import androidx.room.Database;
  3. import androidx.room.RoomDatabase;
  4. import com.example.myroom.entity.People;
  5. //抽象类 继承 RoomDatabase 我们不用实现people中的方法
  6. // version = 1 数据库版本,exportSchema = false不允许导出数据库的架构
  7. @Database(entities = {People.class}, version = 1, exportSchema = false)
  8. public abstract class PeopleDataBase extends RoomDatabase {
  9. /**
  10. * Java 抽象类的一些特点
  11. * 不能被实例化:抽象类不能被实例化,因为它没有具体的实现细节。它只能被继承,并且子类必须实现抽象类中的所有抽象方法。
  12. * 包含抽象方法:抽象类可以包含抽象方法,这些方法只有声明但没有实现。子类必须实现这些抽象方法,否则它也必须被声明为抽象类。
  13. * 提供通用功能和行为:抽象类提供了一些通用功能和行为,这些功能和行为可以被其子类继承和重用。子类可以根据需要扩展这些功能和行为,或者重写它们以提供不同的实现。
  14. * 用于设计高层次的抽象:抽象类可以用于表示一个高层次的抽象概念或者一个通用模板,使得代码更加模块化和可维护。通过将一些公共方法和行为提取到一个抽象类中,可以避免在多个子类中重复实现相同的功能。
  15. * 扩展性:抽象类可以定义一些扩展的接口,子类可以选择实现这些接口来提供额外的功能。这使得抽象类具有很好的扩展性,可以根据需要添加新的功能和行为
  16. */
  17. /*
  18. public abstract PeopleDao peopleDao();
  19. }

4.MainActivity.java

  1. package com.example.myroom;
  2. import android.os.Bundle;
  3. import android.util.Log;
  4. import android.view.View;
  5. import android.widget.Button;
  6. import android.widget.EditText;
  7. import android.widget.TextView;
  8. import androidx.appcompat.app.AppCompatActivity;
  9. import androidx.room.Room;
  10. import com.example.myroom.dao.PeopleDao;
  11. import com.example.myroom.dao.PeopleDataBase;
  12. import com.example.myroom.entity.People;
  13. import java.util.List;
  14. public class MainActivity extends AppCompatActivity {
  15. PeopleDataBase DB;
  16. private Button btnInsert, btnDelete, btnUpdate, btnSelect, btnDeleteData;
  17. private TextView textContent;
  18. private EditText etName, etAge, etSex, etSelect, etDelete, etUpdate;
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23. DB = Room.databaseBuilder(this, PeopleDataBase.class, "peopleDB")
  24. // 默认不允许在主线程中连接数据库 强制在主线程中处理
  25. .allowMainThreadQueries()
  26. .build();
  27. textContent = findViewById(R.id.tvcontent);
  28. etName = findViewById(R.id.etName);
  29. etAge = findViewById(R.id.etAge);
  30. etSex = findViewById(R.id.etSex);
  31. etSelect = findViewById(R.id.etSelect);
  32. etDelete = findViewById(R.id.etDelete);
  33. etUpdate = findViewById(R.id.etUpdate);
  34. btnInsert = findViewById(R.id.btnSave);
  35. btnDelete = findViewById(R.id.btnDelete);
  36. btnUpdate = findViewById(R.id.btnUpdate);
  37. btnSelect = findViewById(R.id.btnselect);
  38. btnDeleteData = findViewById(R.id.btnDeleteTB);
  39. //查询数据
  40. selectData(null);
  41. //按钮事件 插入数据
  42. btnInsert.setOnClickListener(new View.OnClickListener() {
  43. @Override
  44. public void onClick(View v) {
  45. //插入数据 防止空
  46. String name = etName.getText().toString().equals("") ? "张三" : etName.getText().toString();
  47. int age = etAge.getText().toString().equals("") ? 20 : Integer.parseInt(etAge.getText().toString());
  48. String sex = etSex.getText().toString().equals("") ? "男" : etSex.getText().toString();
  49. People people = new People(name, age, sex);
  50. DB.peopleDao().insertDataS(people);
  51. //查询数据
  52. selectData(null);
  53. }
  54. });
  55. //修改数据
  56. btnUpdate.setOnClickListener(new View.OnClickListener() {
  57. @Override
  58. public void onClick(View v) {
  59. //修改
  60. int id = etUpdate.getText().toString().equals("") ? 0 : Integer.parseInt(etUpdate.getText().toString());
  61. if (id != 0) {
  62. String name = etName.getText().toString();
  63. int age = Integer.parseInt(etAge.getText().toString());
  64. String sex = etSex.getText().toString();
  65. People people = new People(name, age, sex);
  66. people.setId(id);
  67. DB.peopleDao().updateData(people);
  68. //查询
  69. selectData(null);
  70. }
  71. }
  72. });
  73. //删除
  74. btnDelete.setOnClickListener(new View.OnClickListener() {
  75. @Override
  76. public void onClick(View v) {
  77. int id = etDelete.getText().toString().equals("") ? 0 : Integer.parseInt(etDelete.getText().toString());
  78. if (id != 0) {
  79. People people = new People();
  80. people.setId(id);
  81. DB.peopleDao().deleteDataS(people);
  82. //查询
  83. selectData(null);
  84. }
  85. }
  86. });
  87. //根据id 查数据
  88. btnSelect.setOnClickListener(new View.OnClickListener() {
  89. @Override
  90. public void onClick(View v) {
  91. int id = etSelect.getText().toString().equals("") ? 0 : Integer.parseInt(etSelect.getText().toString());
  92. if (id != 0) {
  93. selectData(id);
  94. }
  95. }
  96. });
  97. //删除全部数据
  98. btnDeleteData.setOnClickListener(new View.OnClickListener() {
  99. @Override
  100. public void onClick(View v) {
  101. DB.peopleDao().deleteTableData();
  102. }
  103. });
  104. }
  105. /**
  106. * 查询数据的方法
  107. */
  108. public void selectData(Integer id) {
  109. try {
  110. StringBuilder text = new StringBuilder();
  111. if (id == null || id == 0) {
  112. List<People> peopleList = DB.peopleDao().getPeoples();
  113. if (peopleList.size() != 0) {
  114. for (int i = 0; i < peopleList.size(); i++) {
  115. People people = peopleList.get(i);
  116. text.append("id:")
  117. .append(people.getId())
  118. .append("---name:")
  119. .append(people.getName())
  120. .append("---age:")
  121. .append(people.getAge())
  122. .append("---sex:")
  123. .append(people.getSex())
  124. .append("\n");
  125. }
  126. } else {
  127. text.append("没有可用的数据");
  128. }
  129. } else {
  130. People people = DB.peopleDao().getPeople(id);
  131. text.append("id:")
  132. .append(people.getId())
  133. .append("---name:")
  134. .append(people.getName())
  135. .append("---age:")
  136. .append(people.getAge())
  137. .append("---sex:")
  138. .append(people.getSex());
  139. }
  140. textContent.setText(text.toString());
  141. } catch (Exception e) {
  142. Log.e("TAG", "----查询失败------------" + e.getMessage());
  143. }
  144. }
  145. }

5.布局文件 activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity">
  8. <Button
  9. android:id="@+id/btnUpdate"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:text="修改"
  13. app:layout_constraintBottom_toBottomOf="@+id/etUpdate"
  14. app:layout_constraintEnd_toStartOf="@+id/guideline10"
  15. app:layout_constraintHorizontal_bias="0.5"
  16. app:layout_constraintStart_toEndOf="@+id/etUpdate"
  17. app:layout_constraintTop_toTopOf="@+id/etUpdate"
  18. app:layout_constraintVertical_bias="0.0" />
  19. <androidx.constraintlayout.widget.Guideline
  20. android:id="@+id/guideline2"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:orientation="horizontal"
  24. app:layout_constraintGuide_percent="0.05" />
  25. <TextView
  26. android:id="@+id/textView"
  27. android:layout_width="match_parent"
  28. android:layout_height="0dp"
  29. android:text="Room简单应用:"
  30. android:textSize="24sp"
  31. app:layout_constraintBottom_toTopOf="@+id/guideline2"
  32. app:layout_constraintEnd_toEndOf="parent"
  33. app:layout_constraintStart_toStartOf="parent"
  34. app:layout_constraintTop_toTopOf="parent" />
  35. <Button
  36. android:id="@+id/btnSave"
  37. android:layout_width="wrap_content"
  38. android:layout_height="wrap_content"
  39. android:layout_marginTop="4dp"
  40. android:text="保存"
  41. app:layout_constraintBottom_toTopOf="@+id/guideline9"
  42. app:layout_constraintEnd_toStartOf="@+id/guideline10"
  43. app:layout_constraintHorizontal_bias="0.203"
  44. app:layout_constraintStart_toStartOf="@+id/guideline5"
  45. app:layout_constraintTop_toTopOf="@+id/guideline4" />
  46. <Button
  47. android:id="@+id/btnDelete"
  48. android:layout_width="wrap_content"
  49. android:layout_height="wrap_content"
  50. android:text="删除"
  51. app:layout_constraintBottom_toBottomOf="@+id/etDelete"
  52. app:layout_constraintEnd_toStartOf="@+id/guideline10"
  53. app:layout_constraintHorizontal_bias="0.5"
  54. app:layout_constraintStart_toEndOf="@+id/etDelete"
  55. app:layout_constraintTop_toTopOf="@+id/etDelete" />
  56. <Button
  57. android:id="@+id/btnselect"
  58. android:layout_width="wrap_content"
  59. android:layout_height="wrap_content"
  60. android:text="查询"
  61. app:layout_constraintBottom_toBottomOf="@+id/etSelect"
  62. app:layout_constraintEnd_toStartOf="@+id/guideline10"
  63. app:layout_constraintHorizontal_bias="0.5"
  64. app:layout_constraintStart_toEndOf="@+id/etSelect"
  65. app:layout_constraintTop_toTopOf="@+id/etSelect" />
  66. <Button
  67. android:id="@+id/btnDeleteTB"
  68. android:layout_width="wrap_content"
  69. android:layout_height="wrap_content"
  70. android:layout_marginTop="4dp"
  71. android:text="删除表数据"
  72. app:layout_constraintBottom_toTopOf="@+id/guideline9"
  73. app:layout_constraintEnd_toStartOf="@+id/guideline10"
  74. app:layout_constraintHorizontal_bias="0.873"
  75. app:layout_constraintStart_toStartOf="@+id/guideline5"
  76. app:layout_constraintTop_toTopOf="@+id/guideline4" />
  77. <androidx.constraintlayout.widget.Guideline
  78. android:id="@+id/guideline3"
  79. android:layout_width="wrap_content"
  80. android:layout_height="wrap_content"
  81. android:orientation="horizontal"
  82. app:layout_constraintGuide_percent="0.13" />
  83. <androidx.constraintlayout.widget.Guideline
  84. android:id="@+id/guideline4"
  85. android:layout_width="wrap_content"
  86. android:layout_height="wrap_content"
  87. android:orientation="horizontal"
  88. app:layout_constraintGuide_percent="0.29548565" />
  89. <TextView
  90. android:id="@+id/textView2"
  91. android:layout_width="wrap_content"
  92. android:layout_height="wrap_content"
  93. android:text="姓名:"
  94. android:textSize="24sp"
  95. app:layout_constraintBottom_toTopOf="@+id/guideline3"
  96. app:layout_constraintEnd_toStartOf="@+id/etName"
  97. app:layout_constraintHorizontal_bias="0.5"
  98. app:layout_constraintStart_toStartOf="@+id/guideline5" />
  99. <EditText
  100. android:id="@+id/etName"
  101. android:layout_width="200dp"
  102. android:layout_height="wrap_content"
  103. android:ems="10"
  104. android:hint="请输入"
  105. android:inputType="text"
  106. app:layout_constraintBottom_toBottomOf="@+id/textView2"
  107. app:layout_constraintEnd_toStartOf="@+id/guideline10"
  108. app:layout_constraintHorizontal_bias="0.5"
  109. app:layout_constraintStart_toEndOf="@+id/textView2"
  110. app:layout_constraintTop_toTopOf="@+id/textView2" />
  111. <androidx.constraintlayout.widget.Guideline
  112. android:id="@+id/guideline5"
  113. android:layout_width="wrap_content"
  114. android:layout_height="wrap_content"
  115. android:orientation="vertical"
  116. app:layout_constraintGuide_percent="0.05352798" />
  117. <androidx.constraintlayout.widget.Guideline
  118. android:id="@+id/guideline6"
  119. android:layout_width="wrap_content"
  120. android:layout_height="wrap_content"
  121. android:orientation="horizontal"
  122. app:layout_constraintGuide_percent="0.21" />
  123. <androidx.constraintlayout.widget.Guideline
  124. android:id="@+id/guideline8"
  125. android:layout_width="wrap_content"
  126. android:layout_height="wrap_content"
  127. android:orientation="horizontal"
  128. app:layout_constraintGuide_percent="0.6" />
  129. <androidx.constraintlayout.widget.Guideline
  130. android:id="@+id/guideline9"
  131. android:layout_width="wrap_content"
  132. android:layout_height="wrap_content"
  133. android:orientation="horizontal"
  134. app:layout_constraintGuide_percent="0.37" />
  135. <TextView
  136. android:id="@+id/textView3"
  137. android:layout_width="wrap_content"
  138. android:layout_height="wrap_content"
  139. android:text="性别:"
  140. android:textSize="24sp"
  141. app:layout_constraintBottom_toTopOf="@+id/guideline6"
  142. app:layout_constraintEnd_toStartOf="@+id/etSex"
  143. app:layout_constraintHorizontal_bias="0.5"
  144. app:layout_constraintStart_toStartOf="@+id/guideline5" />
  145. <EditText
  146. android:id="@+id/etSex"
  147. android:layout_width="200dp"
  148. android:layout_height="wrap_content"
  149. android:ems="10"
  150. android:hint="请输入"
  151. android:inputType="text"
  152. app:layout_constraintBottom_toBottomOf="@+id/textView3"
  153. app:layout_constraintEnd_toStartOf="@+id/guideline10"
  154. app:layout_constraintHorizontal_bias="0.5"
  155. app:layout_constraintStart_toEndOf="@+id/textView3"
  156. app:layout_constraintTop_toTopOf="@+id/textView3" />
  157. <EditText
  158. android:id="@+id/etAge"
  159. android:layout_width="200dp"
  160. android:layout_height="wrap_content"
  161. android:ems="10"
  162. android:hint="请输入"
  163. android:inputType="number"
  164. app:layout_constraintBottom_toBottomOf="@+id/textView4"
  165. app:layout_constraintEnd_toStartOf="@+id/guideline10"
  166. app:layout_constraintHorizontal_bias="0.5"
  167. app:layout_constraintStart_toEndOf="@+id/textView4"
  168. app:layout_constraintTop_toTopOf="@+id/textView4" />
  169. <TextView
  170. android:id="@+id/textView4"
  171. android:layout_width="wrap_content"
  172. android:layout_height="wrap_content"
  173. android:text="年龄:"
  174. android:textSize="24sp"
  175. app:layout_constraintBottom_toTopOf="@+id/guideline4"
  176. app:layout_constraintEnd_toStartOf="@+id/etAge"
  177. app:layout_constraintHorizontal_bias="0.5"
  178. app:layout_constraintStart_toStartOf="@+id/guideline5" />
  179. <androidx.constraintlayout.widget.Guideline
  180. android:id="@+id/guideline10"
  181. android:layout_width="wrap_content"
  182. android:layout_height="wrap_content"
  183. android:orientation="vertical"
  184. app:layout_constraintGuide_percent="0.9" />
  185. <EditText
  186. android:id="@+id/etSelect"
  187. android:layout_width="100dp"
  188. android:layout_height="wrap_content"
  189. android:ems="10"
  190. android:hint="请输入id"
  191. android:inputType="number"
  192. app:layout_constraintBottom_toTopOf="@+id/guideline8"
  193. app:layout_constraintEnd_toStartOf="@+id/btnselect"
  194. app:layout_constraintHorizontal_bias="0.5"
  195. app:layout_constraintStart_toStartOf="@+id/guideline5"
  196. app:layout_constraintTop_toTopOf="@+id/guideline9"
  197. app:layout_constraintVertical_bias="0.0" />
  198. <EditText
  199. android:id="@+id/etDelete"
  200. android:layout_width="100dp"
  201. android:layout_height="wrap_content"
  202. android:ems="10"
  203. android:hint="请输入id"
  204. android:inputType="number"
  205. app:layout_constraintBottom_toTopOf="@+id/guideline8"
  206. app:layout_constraintEnd_toStartOf="@+id/btnDelete"
  207. app:layout_constraintHorizontal_bias="0.5"
  208. app:layout_constraintStart_toStartOf="@+id/guideline5"
  209. app:layout_constraintTop_toTopOf="@+id/guideline9"
  210. app:layout_constraintVertical_bias="0.451" />
  211. <EditText
  212. android:id="@+id/etUpdate"
  213. android:layout_width="100dp"
  214. android:layout_height="wrap_content"
  215. android:ems="10"
  216. android:hint="请输入id"
  217. android:inputType="number"
  218. app:layout_constraintBottom_toTopOf="@+id/guideline8"
  219. app:layout_constraintEnd_toStartOf="@+id/btnUpdate"
  220. app:layout_constraintHorizontal_bias="0.5"
  221. app:layout_constraintStart_toStartOf="@+id/guideline5"
  222. app:layout_constraintTop_toTopOf="@+id/etSelect"
  223. app:layout_constraintVertical_bias="1.0" />
  224. <TextView
  225. android:id="@+id/tvcontent"
  226. android:layout_width="0dp"
  227. android:layout_height="0dp"
  228. app:layout_constraintBottom_toBottomOf="parent"
  229. app:layout_constraintEnd_toStartOf="@+id/guideline10"
  230. app:layout_constraintStart_toStartOf="@+id/guideline5"
  231. app:layout_constraintTop_toTopOf="@+id/guideline8"
  232. tools:hint="这里显示数据" />
  233. </androidx.constraintlayout.widget.ConstraintLayout>

示例图:

数据库

把这三个文件导出查看数据库:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/515527
推荐阅读
相关标签
  

闽ICP备14008679号