【笔记】Android Room学习笔记

前言

Android Room 学习笔记
使用Room可以简化SQLite数据库的创建和对数据的增删改查

引入依赖

/app/build.gradle
1
2
3
4
5
6
7
8
dependencies {

...

def room_version = "2.2.0-alpha01"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version" // Room注解处理器
}

创建实体类

  • 根据需要操作的数据表结构创建对应的实体类,实体类上使用@Entity注解标注

@PrimaryKey:定义主键
@PrimaryKey(autoGenerate = true):定义主键自增

/app/src/main/java/.../pojo/User.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@Entity
public class User {

@PrimaryKey(autoGenerate = true)
private Integer _id;
private String username;
private String password;

public User(String username, String password) {
this.username = username;
this.password = password;
}

public Integer get_id() {
return _id;
}

public void set_id(Integer _id) {
this._id = _id;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

@Override
public String toString() {
return "User{" +
"_id=" + _id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}

创建Dao接口

  • 创建Dao接口,定义增删改查抽象方法,可以使用@Query注解手动指定SQL语句
/app/src/main/java/.../dao/UserDao.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Dao
public interface UserDao {

@Insert
void insertUser(User ... users);

@Delete
void deleteUser(User ... users);

@Update
void updateUser(User ... users);

@Query("SELECT * FROM user")
List<User> getAllUsers();

}

创建Database类

  • 创建Database抽象类,使用单例模式实例化数据库对象

.allowMainThreadQueries():强制开启主线程也可以操作数据库,一般在测试时使用

/app/src/main/java/.../UserDatabase.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 关联实体类
@Database(entities = {User.class}, version = 1, exportSchema = false)
public abstract class UserDatabase extends RoomDatabase {

// 将Dao接口暴露给用户
public abstract UserDao getUserDao();

// 单例模式
private static UserDatabase instance;
public static synchronized UserDatabase getInstance(Context context) {
if (instance == null) {
instance = Room.databaseBuilder(
context.getApplicationContext(),
UserDatabase.class,
"user_database" // 定义数据库名
)
//.allowMainThreadQueries()
.build();
}
return instance;
}

}

自定义数据库引擎类

  • 在数据库引擎类中定义增删改查的方法
/app/src/main/java/.../DBEngine.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
public class DBEngine {

private UserDao userDao;

public DBEngine(Context context) {
UserDatabase userDatabase = UserDatabase.getInstance(context);
userDao = userDatabase.getUserDao();
}

/*

*/
public void insertUsers(User ... users) {
new InsertAsyncTask(userDao).execute(users);
}

static class InsertAsyncTask extends AsyncTask<User, Void, Void> {

private UserDao userDao;

public InsertAsyncTask(UserDao userDao) {
this.userDao = userDao;
}

@Override
protected Void doInBackground(User... users) {
userDao.insertUsers(users);
return null;
}
}

/*

*/
public void updateUsers(User ... users) {
new InsertAsyncTask(userDao).execute(users);
}

static class UpdateAsyncTask extends AsyncTask<User, Void, Void> {

private UserDao userDao;

public UpdateAsyncTask(UserDao userDao) {
this.userDao = userDao;
}

@Override
protected Void doInBackground(User... users) {
userDao.updateUsers(users);
return null;
}
}

/*

*/
public void deleteUsers(User ... users) {
new InsertAsyncTask(userDao).execute(users);
}

static class DeleteAsyncTask extends AsyncTask<User, Void, Void> {

private UserDao userDao;

public DeleteAsyncTask(UserDao userDao) {
this.userDao = userDao;
}

@Override
protected Void doInBackground(User... users) {
userDao.deleteUsers(users);
return null;
}
}

/*
删 全部
*/
public void deleteAllUsers(User ... users) {
new InsertAsyncTask(userDao).execute(users);
}

static class DeleteAllAsyncTask extends AsyncTask<Void, Void, Void> {

private UserDao userDao;

public DeleteAllAsyncTask(UserDao userDao) {
this.userDao = userDao;
}

@Override
protected Void doInBackground(Void... voids) {
userDao.deleteAllUsers();
return null;
}
}

/*
查 全部
*/
public void selectAllUsers(User ... users) {
new InsertAsyncTask(userDao).execute(users);
}

static class SelectAllAsyncTask extends AsyncTask<Void, Void, Void> {

private UserDao userDao;

public SelectAllAsyncTask(UserDao userDao) {
this.userDao = userDao;
}

@Override
protected Void doInBackground(Void... voids) {
List<User> users = userDao.selectAllUsers();
for (User user : users) {
user.toString();
}
return null;
}
}
}

调用引擎类实现增删改查

/app/src/main/java/.../MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class MainActivity extends AppCompatActivity {

DBEngine dbEngine;

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

dbEngine = new DBEngine(this);

// 增 传递新的对象
User zhangsan = new User("zhangsan", "123456");
dbEngine.insertUsers(zhangsan);

// 改 传递新的对象和要修改的id
zhangsan.set_id(0);
dbEngine.updateUsers(zhangsan);

// 删 传递要删除的id
User user = new User();
dbEngine.deleteUsers(user);

// 删除全部
dbEngine.deleteAllUsers();

// 查询全部
dbEngine.selectAllUsers();

}
}

完成

参考文献

哔哩哔哩——Android架构解析