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 写界面

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);
    }
}

Android RoomAndroid架构组件的一部分,它是一个持久性库,提供了对SQLite数据库的抽象层,使得在使用SQLite的强大功能的同时,能够更加方便地访问数据库Room具有以下优势: 1. 针对SQL查询的编译时验证:Room在编译时会检查SQL查询的语法和表结构,可以最大限度地减少错误和重复的代码。 2. 方便的注解:Room使用注解来定义实体类、DAO接口和数据库,可以简化数据库操作的代码编写。 3. 简化数据库迁移路径:Room提供了数据库迁移的支持,可以方便地升级数据库版本,而不需要手动编写复杂的SQL语句。 Room库由三个主要组件组成: 1. 实体(Entity):实体是数据库中的表的映射类,使用注解来定义。每个实体类都应该有一个主键,并且可以定义索引、关联表等。 2. 数据访问对象(DAO):DAO是用于定义数据库操作的接口或抽象类,使用注解来标记。通过DAO可以定义插入、更新、删除等操作,并且可以使用SQL查询语句。 3. 数据库(Database):数据库Room的核心组件,通过注解来定义。数据库类应该是抽象类,并且继承自RoomDatabase。在数据库类中可以定义实体类和DAO接口的关联关系,并且提供数据库的版本号和迁移策略。 以上是关于Android Room的基本介绍和组成部分的说明。通过使用Room,开发者可以更加方便地进行数据库操作,并且减少了编写重复和容易出错的代码的工作量。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [AndroidRoom的基本使用](https://blog.csdn.net/qq_42326415/article/details/119608921)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Android Room 使用详解](https://blog.csdn.net/Snow_Ice_Yang/article/details/128929138)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android Room使用详解](https://blog.csdn.net/fjnu_se/article/details/128173203)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值