一、Room介绍
Android采用Sqlite作为数据库存储。Sqlite代码写起来繁琐且容易出错,所以开源社区里逐渐出现了各种ORM(Object Relational Mapping)库。这些开源ORM库都是为了方便Sqlite的使用,包括数据库的创建,升级,增删改查等。常见的ORM有ORMLite,GreenDAO等。Google也意识到了推出自家ORM的必要性,于是有了Room。
Room和其它ORM库一样,也是在Sqlite上提供了一层抽象。
在介绍Room的使用之前,我们需要先明白几个概念。
Entity:这是一个Model类,对应于数据库中的一张表。Entity类是Sqlite表结构在Java类的映射。
Dao:(Data Access Objects)数据访问对象,顾名思义,我们可以通过它来访问数据。
总的来说就是通过注解的方式操作数据库
二、代码实现
1、添加依赖并同步
在工程build.gradle
中添加下面几句
def room_version = "2.2.0-alpha01"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
2、新建一个类通过@Database注解生成一个数据库
StudentDatabase.java
package com.example.learning01;
import android.content.Context;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
@Database(entities = {Student.class},version = 1,exportSchema = false)//关联数据库
public abstract class StudentDatabase extends RoomDatabase {
//用户只需要操作DAO
public abstract StudentDao get_student_dao();
//单例模式
private static StudentDatabase studentDatabase;
public static synchronized StudentDatabase getInstance(Context context){
if(studentDatabase == null){
studentDatabase = Room.databaseBuilder(context.getApplicationContext(),StudentDatabase.class,"student_database")
//.allowMainThreadQueries() //主线程也能操作数据库 只能测试用
.build();
}
return studentDatabase;
}
}
3、新建一个类通过@Entity注解生成一个表
Student.java
package com.example.learning01;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
//一张表
@Entity
public class Student {
@PrimaryKey(autoGenerate = true)
private int id;
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
4、新建一个类通过@Dao实现增、删、改、查
StudentDao.java
package com.example.learning01;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import java.util.List;
@Dao
public interface StudentDao {
//增
@Insert
void insert_student(Student ... students);
//改
@Update
void update_student(Student ... students);
//删
@Delete
void delete_student(Student ... students);
//删
@Query("DELETE FROM Student")
void delete_all_student();
//查
@Query("SELECT * FROM Student ORDER BY id DESC")
List<Student> get_all_student();
}
5、新建一个类通过实现数据库操作,通过异步方式
DBEngine.java
package com.example.learning01;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import java.util.List;
public class DBEngine {
private static final String TAG = "DBEngine";
private StudentDao studentDao;
public DBEngine(Context context) {
StudentDatabase studentDatabase = StudentDatabase.getInstance(context);
studentDao = studentDatabase.get_student_dao();
}
//插入
public void insert_student(Student ... student) {
new InsertAsynTask(studentDao).execute(student);
}
//更新
public void update_student(Student ... student) {
new UpdateAsynTask(studentDao).execute(student);
}
//删除
public void delete_student(Student ... student) {
new DeleteAsynTask(studentDao).execute(student);
}
//全部删除
public void delete_all_student(Student ... student) {
new DeleteAllAsynTask(studentDao).execute();
}
//全部查询
public void quary_all_student(Student ... student) {
new QuaryAllAsynTask(studentDao).execute();
}
//开启异步操作
static class InsertAsynTask extends AsyncTask<Student,Void,Void> {
private StudentDao studentDao;
public InsertAsynTask(StudentDao studentDao) {
this.studentDao = studentDao;
}
@Override
protected Void doInBackground(Student ... students) {
studentDao.insert_student(students);
return null;
}
}
static class UpdateAsynTask extends AsyncTask<Student,Void,Void> {
private StudentDao studentDao;
public UpdateAsynTask(StudentDao studentDao) {
this.studentDao = studentDao;
}
@Override
protected Void doInBackground(Student... students) {
this.studentDao.update_student(students);
return null;
}
}
static class DeleteAsynTask extends AsyncTask<Student,Void,Void> {
private StudentDao studentDao;
public DeleteAsynTask(StudentDao studentDao) {
this.studentDao = studentDao;
}
@Override
protected Void doInBackground(Student... students) {
this.studentDao.delete_student(students);
return null;
}
}
//全部删除
static class DeleteAllAsynTask extends AsyncTask<Void,Void,Void> {
private StudentDao studentDao;
public DeleteAllAsynTask(StudentDao studentDao) {
this.studentDao = studentDao;
}
@Override
protected Void doInBackground(Void... voids) {
this.studentDao.delete_all_student();
return null;
}
}
static class QuaryAllAsynTask extends AsyncTask<Void,Void,Void> {
private StudentDao studentDao;
public QuaryAllAsynTask(StudentDao studentDao) {
this.studentDao = studentDao;
}
@Override
protected Void doInBackground(Void... voids) {
List<Student> all_student = this.studentDao.get_all_student();
//遍历全部查询的结果
for (Student student:all_student)
{
Log.i(TAG, "doInBackground: "+student.toString());
}
return null;
}
}
}
三、操作数据库
首先定义一个引擎
private DBEngine dbEngine;
然后实现
dbEngine = new DBEngine(this);
完整代码
public class MainActivity extends AppCompatActivity {
private static final String TAG ="MainActivity";
private DBEngine dbEngine;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbEngine = new DBEngine(this);
}
1、增
public void insert_db(View view) {
Student student1 = new Student("xupeng1",10);
Student student2 = new Student("xupeng2",20);
Student student3 = new Student("xupeng3",30);
Student student4 = new Student("xupeng4",40);
dbEngine.insert_student(student1,student2,student3,student4);
}
2、删
public void delete_db(View view) {
Student student = new Student(null,0);
student.setId(3);
dbEngine.delete_student(student);
}
public void delete_all_db(View view) {
dbEngine.delete_all_student();
}
3、改
public void update_db(View view) {
Student student = new Student("weipan",500);
student.setId(3);
dbEngine.update_student(student);
}
4、查
public void find_db(View view) {
dbEngine.quary_all_student();
}
四、操作数据库源码
package com.example.learning01;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private static final String TAG ="MainActivity";
private DBEngine dbEngine;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbEngine = new DBEngine(this);
}
public void create_db(View view) {
}
public void find_db(View view) {
dbEngine.quary_all_student();
}
public void insert_db(View view) {
Student student1 = new Student("xupeng1",10);
Student student2 = new Student("xupeng2",20);
Student student3 = new Student("xupeng3",30);
Student student4 = new Student("xupeng4",40);
dbEngine.insert_student(student1,student2,student3,student4);
}
public void update_db(View view) {
Student student = new Student("weipan",500);
student.setId(3);
dbEngine.update_student(student);
}
public void delete_db(View view) {
Student student = new Student(null,0);
student.setId(3);
dbEngine.delete_student(student);
}
public void delete_all_db(View view) {
dbEngine.delete_all_student();
}
}