Android Room的使用

简介

Room是Google提供的ORM(对象关系映射)库,简单介绍一下ORM,我们使用的编程语言是面向对象语言,而使用的数据库是关系型数据库,将面向对象的语言和面向关系的数据库之间建立一种映射关系,就是ORM。

Room提供了三个重要的部分:

  • @Entity:用于定义封装实际数据的实体类,每个实体类都会在数据库中有一张对应的表,并且表中的列是根据实体类中的字段自动生成的。

  • @Dao:Dao是访问对象的意思,通常在这对数据库的各项操作进行封装,在实际编程时,逻辑层就不需要和底层数据库打交道了,数据库操作直接在Dao层进行交互即可。(类似三层解耦)

  • @Database:用于定义数据库中的关键信息,包括数据库的版本号、包含哪些实体类以及提供Dao层的访问实例。

添加依赖

implementation("androidx.room:room-runtime:2.6.1")
annotationProcessor("androidx.room:room-compiler:2.6.1")

Entity

在类上使用@Entity注解,表示将它声明成一个实体类。Room会利用使用到@Entity注解的类的所有字段来创建表的列,如果存在不希望存储的字段,在其上面添加@Ingore注解即可。

@Entity
class User {
    @PrimaryKey
    public int id;
 
    public String firstName;
    public String lastName;
 
    @Ignore
    Bitmap picture;
    
    //getter/setter方法
}

默认情况下Room使用类名作为表名,使用字段名作为列名,但Room允许我们使用@Entity的tableName属性来指定表名,使用@ColumnInfo的name属性来指定列名

@Entity(tableName = "users")//将表名指定为users
class User {
    @PrimaryKey
    public int id;
 
    @ColumnInfo(name = "first_name")
    public String firstName;
 
    @ColumnInfo(name = "last_name")
    public String lastName;
 
    @Ignore
    Bitmap picture;
    
    //getter、setter方法
}

每个Room实体都必须定义一个主键,用于作为每条数据的唯一标识,Room给我们提供了一个@PrimaryKey来定义主键

@PrimaryKey(autoGenerate = true)//设置为true,表示让SQlite生成唯一的ID,从1开始(即添加一个主键)
public int id;

Dao

Dao层是用来专门与数据库进行交互的,里面都是关于操作数据库的代码,所有访问数据库的操作都在这里进行封装,想调用这里的方法只需new出实例接着直接调用方法即可。

@Dao
interface UserDao{
    
    @Insert
    public Long insertUser(User user);
    
    @Update
    public void updateUser(User user);
    
    @Delete
    public void deleteUser(User user);
    
    @Query("select * from users")
    public List<User> queryUser();
}

Room提供了@Insert、@Delete、@Update、@Query注解,分别表示增删改查。

其中@Insert、@Delete、@Update是不需要我们编写SQL语句的:

  • @Insert表示将User对象插入到数据库中,插入成功后会返回自动生成的主键id
  • @Delete表示会将传入的User对象删除
  • @Update表示会将传入的User对象进行更新,@Delete和@Update也可以返回一个int,表示成功更新的行数

关于@Query注解,因为Room具体无法知道我们想从数据库中查询哪些数据,所以必须编写SQL语句

注意:在Room中引用查询条件的格式是字段名称=:引用值,例如根据id查询User

@Query("select * from users where id=:id")
public User queryById(int id);

另外需要我们注意的是要根据非实体类内的数据(不是@Entity注解标识的类中的字段)进行数据库操作时,只能使用@Query且必须编写SQL语句,如我们要根据非实体类中的statue删除User

@Query("delete from users where 字段=:statue")
public int deleteByState(int statue);

最后:Room支持编译时动态检查SQL语句语法,如果SQL语句写错了,编译就会直接报错,不会将错误隐藏到运行之后才发现。

Database

数据库类必须满足的条件:

  • 必须带有@Database注解,在该注解声明出包含的实体类和版本号
  • 该类必须是一个抽象类且继承自RoomDatabase

如下定义了一个用于保存数据库的AppDatabase类。

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

使用:创建数据库实例并获取Dao对象调用其方法

AppDatabase db=Room.databaseBuilder(getApplicationContext(),AppDatabase.class,"数据库名称").build();
UserDao userDao=db.userDao;
//调用UserDao的方法

实例

  • 创建实体类
@Entity(tableName = "users")
public class User {
    @PrimaryKey(autoGenerate = true)
    private int id;

    private int age;
    private String name;
    private String gender;

    public int getId() {return id;}
    public void setId(int id) {this.id = id;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getGender() {return gender;}
    public void setGender(String gender) {this.gender = gender;}
}
  • 创建UserDao
@Dao
public interface UserDao{
    //添加数据
    @Insert
    Long insertUser(User user);

    @Query("select * from users")
    List<User> queryUser();
	//根据id查询数据
    @Query("select * from users where id=:id")
    User queryById(int id);
}
  • 创建数据库
@Database(entities = {User.class},version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}
  • 测试(这里就演示添加数据和读取数据操作了),由于数据库属于耗时操作,Room是不允许在主线程中进行数据库操作的,这里为了方便测试,在构建AppDatabase调用一个allowMainThreadQueries()方法,表示允许在主线程进行数据库操作。
public class MainActivity extends AppCompatActivity {
    AppDatabase db;
    UserDao userDao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        db= Room.databaseBuilder(getApplicationContext(),AppDatabase.class,"test")
                .allowMainThreadQueries()
                .build();
        userDao= db.userDao();
        Button create=(Button) findViewById(R.id.cerate);
        create.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                User user=new User();
                user.setAge(18);
                user.setName("zhangsan");
                user.setGender("男");
                Long id=userDao.insertUser(user);
                Log.d("MainActivity", String.valueOf(id));
            }
        });
        Button look=(Button) findViewById(R.id.look);
        look.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                User user=userDao.queryById(1);
                Log.d("MainActivity", user.getName());
                Log.d("MainActivity", String.valueOf(user.getAge()));
                Log.d("MainActivity", user.getGender());
            }
        });
        Button update=(Button) findViewById(R.id.update);
    }
}

另外
在最后运行项目时,你可能遇到如下报错
AppDatabase_Impl does not exist
此时你只需:

  • 引入kotlin-kapt
plugins {
    ...
    id 'kotlin-kapt'
}
  • 将annotationProcessor改为kapt
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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 ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值