Android中room的使用

王柳  论坛元老 | 2025-3-27 06:19:40 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1889|帖子 1889|积分 5667

一. 基本介绍 

Android中的数据库操作框架,不能用在Java后端中
Hibernate、JPA、Mybatis等用于后端

Android中操作数据是用SQLiteOpenHelper,用起来很繁琐
room是简化SQLiteOpenHelper操作方式

以注解的情势进行简化 面向注解编程
androidx.room  |  Android Developers (google.cn)
二. room详细使用

1.1 room三要素

1.1.1 实体类 表

这是一个Model类,对应于数据库中的一张表。Entity类是Sqlite表结构在Java类的映射。
1.1.2 Dao 对数据库的增编削查操作

(Data Access Objects)数据访问对象,顾名思义,我们可以通过它来访问数据。
一个Entity代表着一张表,而每张表都需要一个Dao对象,以方便对这张表进行各种操作(增编削查)
1.1.3 database 用于获取Dao的实例

1.2 操作步骤

1.2.1 导包

在app中的build.gradle的dependencies中加入room-runtime room-compiler
  1. implementation 'androidx.room:room-runtime:2.6.1'
  2.     annotationProcessor 'androidx.room:room-compiler:2.6.1'
复制代码
1.2.2 写界面


1.2.3写三要素

实体类
写实体类时在类文件的最上方需要加上@Entity标签,通过该标签将该类与Room中表关联起来。tableName属性可以为该表设置名字,如果不设置,则表名与类名雷同。
@PrimaryKey标签用于指定该字段作为表的主键。
@ColumnInfo标签可用于设置该字段存储在数据库表中的名字并指定字段的类型。
@Ignore标签用来告诉体系忽略该字段大概方法。
  1. package com.example.room.entity;
  2. import androidx.room.Entity;
  3. import androidx.room.PrimaryKey;
  4. /**
  5. * 对应的是user_info表,以操作对象的形式来操作表
  6. */
  7. @Entity
  8. public class UserInfo {
  9.     // 用于标识表中的主键以及主键自增
  10.     @PrimaryKey(autoGenerate = true)
  11.     private Integer id;
  12.     private String name;
  13.     private Integer age;
  14.     private Integer height;
  15.     private Float weight;
  16.     public Integer getId() {
  17.         return id;
  18.     }
  19.     public void setId(Integer id) {
  20.         this.id = id;
  21.     }
  22.     public String getName() {
  23.         return name;
  24.     }
  25.     public void setName(String name) {
  26.         this.name = name;
  27.     }
  28.     public Integer getAge() {
  29.         return age;
  30.     }
  31.     public void setAge(Integer age) {
  32.         this.age = age;
  33.     }
  34.     public Integer getHeight() {
  35.         return height;
  36.     }
  37.     public void setHeight(Integer height) {
  38.         this.height = height;
  39.     }
  40.     public Float getWeight() {
  41.         return weight;
  42.     }
  43.     public void setWeight(Float weight) {
  44.         this.weight = weight;
  45.     }
  46.     @Override
  47.     public String toString() {
  48.         return "UserInfo{" +
  49.                 "id=" + id +
  50.                 ", name='" + name + '\'' +
  51.                 ", age=" + age +
  52.                 ", height=" + height +
  53.                 ", weight=" + weight +
  54.                 '}';
  55.     }
  56. }
复制代码
Dao
在文件的上方,需要加入@Dao标签。
  1. package com.example.room.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.room.entity.UserInfo;
  8. import java.util.List;
  9. /**
  10. * 告诉room这是一个dao,可以进行增删改查的操作,你来帮我生成代码吧。
  11. */
  12. @Dao
  13. public interface UserInfoDao {
  14.     @Insert
  15.     void insert(UserInfo... userInfo);
  16.     // 用类名来代替表名
  17.     @Query("SELECT * FROM UserInfo")
  18.     List<UserInfo> queryAll();
  19.     @Query("SELECT * FROM UserInfo WHERE id = :id")
  20.     UserInfo queryById(Integer id);
  21.     // 默认以主键为条件进行的修改
  22.     @Update
  23.     void update(UserInfo... userInfo);
  24.     @Delete
  25.     void delete(UserInfo userInfo);
  26.     // 带参数的Query是用于执行SQL语句的
  27.     @Query("DELETE FROM UserInfo")
  28.     void deleteAll();
  29. }
复制代码
Database
@Database标签用于告诉体系这是Room数据库对象。entities属性用于指定该数据库有哪些表,若需建立多张表,以逗号相隔开。version属性用于指定数据库版本号,后续数据库的升级正是依据版本号来判断的。该类需要继续自RoomDatabase,在类中,通过Room.databaseBuilder()联合单例设计模式,完成数据库的创建工作。另外,我们创建的Dao对象,在这里以抽象方法的情势返回,只需一行代码即可。
  1. package com.example.room.database;
  2. import android.content.Context;
  3. import androidx.room.Database;
  4. import androidx.room.Room;
  5. import androidx.room.RoomDatabase;
  6. import com.example.room.dao.UserInfoDao;
  7. import com.example.room.entity.UserInfo;
  8. /**
  9. * 获得UserInfoDao的实例,实现增、删、改、查的功能
  10. * 同时获得UserInfoDatabase的实例,在Activity中可进行数据库表的打开,关闭等
  11. * 和SQLiteOpenHelper一样
  12. */
  13. @Database(entities = {UserInfo.class}, version = 1, exportSchema = false)
  14. public abstract class UserInfoDatabase extends RoomDatabase {
  15.     // 规定格式的写法,(写成别的,根据room的版本的不同,可能有运行异常)
  16.     // Java编码规范中的约定
  17.     public abstract UserInfoDao getUserInfoDao();
  18.     public static UserInfoDatabase userInfoDatabase;
  19.     // 获得UserInfoDatabase的实例
  20.     /// 写法和SQLiteOpenHelper一致,用单例模式
  21.     // room默认不能在主线程中操作数据库,因为数据库是一个耗时操作
  22.     // 实际项目中,默认使用异步 --自学
  23.     public static UserInfoDatabase getInstance(Context context) {
  24.         if (userInfoDatabase == null) {
  25.             // 数据库的名字
  26.             userInfoDatabase = Room.databaseBuilder(context.getApplicationContext(),
  27.                             UserInfoDatabase.class, "user-info")
  28.                     // 强制开启在主线程中操作数据库
  29.                     .allowMainThreadQueries()
  30.                     .build();
  31.         }
  32.         return userInfoDatabase;
  33.     }
  34. }
复制代码
MainActivity
  1. package com.example.room;
  2. import android.os.Bundle;
  3. import android.widget.Button;
  4. import android.widget.EditText;
  5. import android.widget.Toast;
  6. import androidx.appcompat.app.AppCompatActivity;
  7. import com.example.room.dao.UserInfoDao;
  8. import com.example.room.database.UserInfoDatabase;
  9. import com.example.room.entity.UserInfo;
  10. public class MainActivity extends AppCompatActivity {
  11.     private EditText edt_name;
  12.     private EditText edt_age;
  13.     private EditText edt_height;
  14.     private EditText edt_weight;
  15.     private Button btn_insert;
  16.     private EditText edt_find_id;
  17.     private Button btn_find_id;
  18.     private Button btn_query;
  19.     private EditText edt_del_id;
  20.     private Button btn_delete;
  21.     private Button btn_update;
  22.     private UserInfoDao userInfoDao;
  23.     @Override
  24.     protected void onCreate(Bundle savedInstanceState) {
  25.         super.onCreate(savedInstanceState);
  26.         setContentView(R.layout.activity_main);
  27.         initViews();
  28.         initEvents();
  29.     }
  30.     private void initEvents() {
  31.         btn_insert.setOnClickListener(v -> {
  32.             UserInfo userInfo = new UserInfo();
  33.             userInfo.setName(edt_name.getText().toString());
  34.             userInfo.setAge(Integer.valueOf(edt_age.getText().toString()));
  35.             userInfo.setHeight(Integer.valueOf(edt_height.getText().toString()));
  36.             userInfo.setWeight(Float.valueOf(edt_weight.getText().toString()));
  37.             userInfoDao.insert(userInfo);
  38.             Toast.makeText(this, "新增成功", Toast.LENGTH_SHORT).show();
  39.         });
  40.     }
  41.     @Override
  42.     protected void onStart() {
  43.         super.onStart();
  44.         userInfoDao = UserInfoDatabase
  45.                 .getInstance(this)
  46.                 .getUserInfoDao();
  47.     }
  48.     private void initViews() {
  49.         edt_name = findViewById(R.id.edt_name);
  50.         edt_age = findViewById(R.id.edt_age);
  51.         edt_height = findViewById(R.id.edt_height);
  52.         edt_weight = findViewById(R.id.edt_weight);
  53.         btn_insert = findViewById(R.id.btn_insert);
  54.         // 通过ID查询的控件
  55.         edt_find_id = findViewById(R.id.edt_find_id);
  56.         btn_find_id = findViewById(R.id.btn_find_id);
  57.         // 查询所有数据
  58.         btn_query = findViewById(R.id.btn_query);
  59.         // 删除指定的ID数据
  60.         edt_del_id = findViewById(R.id.edt_del_id);
  61.         btn_delete = findViewById(R.id.btn_delete);
  62.         // 修改数据
  63.         btn_update = findViewById(R.id.btn_update);
  64.     }
  65. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表