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]