一、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 {//用户只需要操作DAOpublic 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;}@Overridepublic 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 {//增@Insertvoid insert_student(Student ... students);//改@Updatevoid update_student(Student ... students);//删@Deletevoid 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;}@Overrideprotected 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;}@Overrideprotected 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;}@Overrideprotected 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;}@Overrideprotected 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;}@Overrideprotected 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;@Overrideprotected 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;@Overrideprotected 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();}
}