1端铛,三角色
(1)表:定義一個(gè)類,加上注解@Entity努酸,類里需要定義主鍵,使用@PrimaryKey標(biāo)識(shí)杜恰,如果主鍵自動(dòng)產(chǎn)生增長(zhǎng)获诈,需要加上(autoGenerate = true),其他變量根據(jù)自身業(yè)務(wù)定義心褐,下面例子定義了一個(gè)Student表類:
package com.mike.androidtips.database.room;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
//表
@Entity
public class Student {
@PrimaryKey (autoGenerate = true)
private int id;
int age;
String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public Student() {
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
'}';
}
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;
}
}
(2)DAO: Database Access Object, 數(shù)據(jù)庫訪問對(duì)象類舔涎,作用是對(duì)數(shù)據(jù)庫中的表進(jìn)行增刪改查操作。在類上加@Dao注解逗爹。其他是操作類注解:@Insert亡嫌, @Update, @Delete掘而, @Query挟冠,@Query需要加SQL語句,具體看StudentDao類:
@Dao
public interface StudentDao {
//增
@Insert
public void addStudents(Student...students);
// 刪
@Delete
public void deleteStudents(Student...students);
// 刪 全部
@Query("DELETE FROM Student")
public void deleteAllStudents();
//改
@Update
public void updateStudents(Student...students);
// 查
@Query("SELECT * FROM Student ORDER BY ID DESC")
public List<Student> getAllStudents();
}
(3) 數(shù)據(jù)庫類:和前面定義的表以及Dao關(guān)聯(lián)起來
- 數(shù)據(jù)庫定義成抽象類
- 數(shù)據(jù)庫類需添加注解@Database镣屹,里面定義版本號(hào)圃郊,以及通過entries關(guān)聯(lián)表
- 需要定義成單例模式
- 定義抽象方法价涝,獲取Dao女蜈,
@Database(entities = {Student.class}, version = 1, exportSchema = false)
public abstract class StudentDatabase extends RoomDatabase {
private static StudentDatabase INSTANCE;
public static synchronized StudentDatabase getInstance(Context context) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(), StudentDatabase.class,
"student database")
//數(shù)據(jù)庫默認(rèn)是異步線程
//.allowMainThreadQueries() //強(qiáng)制開啟主線程也可以用數(shù)據(jù)庫 ,真實(shí)環(huán)境不要用
.build();
}
return INSTANCE;
}
public abstract StudentDao getStudentDao();
@NonNull
@Override
protected SupportSQLiteOpenHelper createOpenHelper(DatabaseConfiguration config) {
return null;
}
@NonNull
@Override
protected InvalidationTracker createInvalidationTracker() {
return null;
}
@Override
public void clearAllTables() {
}
}
- 數(shù)據(jù)庫的使用,封裝一個(gè)DBEngine伪窖,對(duì)外(User)提供增刪改查的API逸寓。
- DBEngine在構(gòu)造中獲取Dao
- 封裝多個(gè)AsyncTask操作數(shù)據(jù)庫,把Dao傳值進(jìn)去
- API里調(diào)用AsyncTask的execute方法
public class DBEngine {
private StudentDao studentDao;
private String TAG = "DBEngine";
public DBEngine(Context context) {
StudentDatabase database = StudentDatabase.getInstance(context);
studentDao = database.getStudentDao();
}
//插入
public void addStudents(Student...students) {
new AddAsyncTask(studentDao).execute(students);
}
//更新
public void updateStudents(Student...students) {
new UpdateAsyncTask(studentDao).execute(students);
}
//刪除單個(gè)
public void deleteStudents(Student...students) {
Log.d(TAG, "enter deleteStudents");
new DeleteAsyncTask(studentDao).execute(students);
}
//刪除所有
public void deleteAllStudents(){
new DeleteAllAsyncTask(studentDao).execute();
}
//
public void queryAllStudents() {
Log.d("DBEngine", "enter queryAllStudents");
new QueryAsyncTask(studentDao).execute();
}
//插入task
static class AddAsyncTask extends AsyncTask<Student, Void, Void> {
private StudentDao studentDao;
public AddAsyncTask(StudentDao studentDao) {
this.studentDao = studentDao;
}
@Override
protected Void doInBackground(Student... students) {
studentDao.addStudents(students);
return null;
}
}
//更新task
static class UpdateAsyncTask extends AsyncTask<Student, Void, Void> {
private StudentDao studentDao;
public UpdateAsyncTask(StudentDao studentDao) {
this.studentDao = studentDao;
}
@Override
protected Void doInBackground(Student... students) {
studentDao.updateStudents(students);
return null;
}
}
//刪除
static class DeleteAsyncTask extends AsyncTask<Student, Void, Void> {
private StudentDao studentDao;
public DeleteAsyncTask(StudentDao studentDao) {
this.studentDao = studentDao;
Log.d("DBEngine", "enter DeleteAsyncTask");
}
@Override
protected Void doInBackground(Student... students) {
studentDao.deleteStudents(students);
Log.d("DBEngine", "enter DeleteAsyncTask, doInBackground");
return null;
}
}
//刪除全部
static class DeleteAllAsyncTask extends AsyncTask<Void, Void, Void> {
private StudentDao studentDao;
public DeleteAllAsyncTask(StudentDao studentDao) {
this.studentDao = studentDao;
}
@Override
protected Void doInBackground(Void... voids) {
studentDao.deleteAllStudents();
return null;
}
}
static class QueryAsyncTask extends AsyncTask<Void, Void, Void> {
private StudentDao studentDao;
public QueryAsyncTask(StudentDao studentDao) {
this.studentDao = studentDao;
}
@Override
protected Void doInBackground(Void... voids) {
Log.d("DBEngine" , "QueryAsyncTask doInBackground");
List<Student> allStudents = studentDao.getAllStudents();
Log.d("DBEngine" , "QueryAsyncTask doInBackground, size = " + allStudents.size());
for (Student allStudent : allStudents) {
Log.d("DBEngine" , "全部查詢每一項(xiàng): " + allStudent.toString());
}
return null;
}
}
}
3, User使用DBEngine
public class RoomDatabaseActivity extends Activity {
private String TAG = RoomDatabaseActivity.class.getSimpleName();
private DBEngine dbEngine;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_roomdatabase_layout);
dbEngine = new DBEngine(this);
}
public void insertAction(View view) {
Student student1 = new Student(20, "張三");
Student student2 = new Student(30, "李四");
Student student3 = new Student(15, "王五");
Log.d(TAG, "insertAction...");
dbEngine.addStudents(student1, student2, student3);
}
public void updateAction(View view) {
Student student = new Student(28, "王二麻子");
student.setId(3);
dbEngine.updateStudents(student);
}
public void deleteAction(View view) {
Log.d(TAG, "enter deleteAction");
Student student = new Student();
student.setId(3);
dbEngine.deleteStudents(student);
}
public void queryAction(View view) {
dbEngine.queryAllStudents();
}
public void deleteAll(View view) {
dbEngine.deleteAllStudents();
}
}