一. 基本介绍
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);
- }
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |