王柳 发表于 2025-3-27 06:19:40

Android中room的使用

一. 基本介绍 

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
implementation 'androidx.room:room-runtime:2.6.1'
    annotationProcessor 'androidx.room:room-compiler:2.6.1' 1.2.2 写界面

https://i-blog.csdnimg.cn/direct/819be1b1fc8e4bb395259c4ea2c03e56.png
1.2.3写三要素

实体类
写实体类时在类文件的最上方需要加上@Entity标签,通过该标签将该类与Room中表关联起来。tableName属性可以为该表设置名字,如果不设置,则表名与类名雷同。
@PrimaryKey标签用于指定该字段作为表的主键。
@ColumnInfo标签可用于设置该字段存储在数据库表中的名字并指定字段的类型。
@Ignore标签用来告诉体系忽略该字段大概方法。
package com.example.room.entity;

import androidx.room.Entity;
import androidx.room.PrimaryKey;

/**
* 对应的是user_info表,以操作对象的形式来操作表
*/
@Entity
public class UserInfo {
    // 用于标识表中的主键以及主键自增
    @PrimaryKey(autoGenerate = true)
    private Integer id;
    private String name;
    private Integer age;
    private Integer height;
    private Float weight;

    public Integer getId() {
      return id;
    }

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

    public String getName() {
      return name;
    }

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

    public Integer getAge() {
      return age;
    }

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

    public Integer getHeight() {
      return height;
    }

    public void setHeight(Integer height) {
      this.height = height;
    }

    public Float getWeight() {
      return weight;
    }

    public void setWeight(Float weight) {
      this.weight = weight;
    }

    @Override
    public String toString() {
      return "UserInfo{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                ", weight=" + weight +
                '}';
    }
}
Dao
在文件的上方,需要加入@Dao标签。
package com.example.room.dao;

import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;

import com.example.room.entity.UserInfo;

import java.util.List;

/**
* 告诉room这是一个dao,可以进行增删改查的操作,你来帮我生成代码吧。
*/
@Dao
public interface UserInfoDao {

    @Insert
    void insert(UserInfo... userInfo);

    // 用类名来代替表名
    @Query("SELECT * FROM UserInfo")
    List<UserInfo> queryAll();
    @Query("SELECT * FROM UserInfo WHERE id = :id")
    UserInfo queryById(Integer id);

    // 默认以主键为条件进行的修改
    @Update
    void update(UserInfo... userInfo);
    @Delete
    void delete(UserInfo userInfo);

    // 带参数的Query是用于执行SQL语句的
    @Query("DELETE FROM UserInfo")
    void deleteAll();

}
Database
@Database标签用于告诉体系这是Room数据库对象。entities属性用于指定该数据库有哪些表,若需建立多张表,以逗号相隔开。version属性用于指定数据库版本号,后续数据库的升级正是依据版本号来判断的。该类需要继续自RoomDatabase,在类中,通过Room.databaseBuilder()联合单例设计模式,完成数据库的创建工作。另外,我们创建的Dao对象,在这里以抽象方法的情势返回,只需一行代码即可。
package com.example.room.database;

import android.content.Context;

import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;

import com.example.room.dao.UserInfoDao;
import com.example.room.entity.UserInfo;

/**
* 获得UserInfoDao的实例,实现增、删、改、查的功能
* 同时获得UserInfoDatabase的实例,在Activity中可进行数据库表的打开,关闭等
* 和SQLiteOpenHelper一样
*/
@Database(entities = {UserInfo.class}, version = 1, exportSchema = false)
public abstract class UserInfoDatabase extends RoomDatabase {

    // 规定格式的写法,(写成别的,根据room的版本的不同,可能有运行异常)
    // Java编码规范中的约定
    public abstract UserInfoDao getUserInfoDao();
    public static UserInfoDatabase userInfoDatabase;

    // 获得UserInfoDatabase的实例
    /// 写法和SQLiteOpenHelper一致,用单例模式
    // room默认不能在主线程中操作数据库,因为数据库是一个耗时操作
    // 实际项目中,默认使用异步 --自学
    public static UserInfoDatabase getInstance(Context context) {
      if (userInfoDatabase == null) {
            // 数据库的名字
            userInfoDatabase = Room.databaseBuilder(context.getApplicationContext(),
                            UserInfoDatabase.class, "user-info")
                  // 强制开启在主线程中操作数据库
                  .allowMainThreadQueries()
                  .build();
      }
      return userInfoDatabase;
    }
} MainActivity
package com.example.room;

import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.example.room.dao.UserInfoDao;
import com.example.room.database.UserInfoDatabase;
import com.example.room.entity.UserInfo;

public class MainActivity extends AppCompatActivity {

    private EditText edt_name;
    private EditText edt_age;
    private EditText edt_height;
    private EditText edt_weight;
    private Button btn_insert;
    private EditText edt_find_id;
    private Button btn_find_id;
    private Button btn_query;
    private EditText edt_del_id;
    private Button btn_delete;
    private Button btn_update;
    private UserInfoDao userInfoDao;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      initViews();
      initEvents();
    }

    private void initEvents() {
      btn_insert.setOnClickListener(v -> {
            UserInfo userInfo = new UserInfo();
            userInfo.setName(edt_name.getText().toString());
            userInfo.setAge(Integer.valueOf(edt_age.getText().toString()));
            userInfo.setHeight(Integer.valueOf(edt_height.getText().toString()));
            userInfo.setWeight(Float.valueOf(edt_weight.getText().toString()));
            userInfoDao.insert(userInfo);
            Toast.makeText(this, "新增成功", Toast.LENGTH_SHORT).show();
      });
    }

    @Override
    protected void onStart() {
      super.onStart();
      userInfoDao = UserInfoDatabase
                .getInstance(this)
                .getUserInfoDao();
    }

    private void initViews() {
      edt_name = findViewById(R.id.edt_name);
      edt_age = findViewById(R.id.edt_age);
      edt_height = findViewById(R.id.edt_height);
      edt_weight = findViewById(R.id.edt_weight);
      btn_insert = findViewById(R.id.btn_insert);
      // 通过ID查询的控件
      edt_find_id = findViewById(R.id.edt_find_id);
      btn_find_id = findViewById(R.id.btn_find_id);
      // 查询所有数据
      btn_query = findViewById(R.id.btn_query);

      // 删除指定的ID数据
      edt_del_id = findViewById(R.id.edt_del_id);
      btn_delete = findViewById(R.id.btn_delete);

      // 修改数据
      btn_update = findViewById(R.id.btn_update);
    }
}

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