目录
- 前言
- Room的基本使用
---- 添加依赖
---- 创建实体类
---- 创建数据访问对象 (DAO)进行增删改查
---- 创建数据库Room基础类
---- 创建数据库业务管理类
---- 在Activity类中使用Room- Room数据库升级
前言
Room属于Google推出的JetPack组件库中的数据库框架。
Room 持久性库在 SQLite 之上提供了一个抽象层,以允许流畅的数据库访问,同时利用 SQLite 的全部功能。
- 方便的注释,最大限度地减少重复和容易出错的样板代码。
- SQL 查询的编译时验证。
- 简化的数据库迁移路径。
Room的基本使用
-
添加依赖
在build.gradle
中添加依赖
dependencies {
//Room数据库框架
def room_version ="2.4.1"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
// 可选 - Kotlin扩展和协程支持
implementation "androidx.room:room-ktx:$room_version"
// 可选 - RxJava 支持
implementation "androidx.room:room-rxjava2:$room_version"
// 可选 - Guava 支持, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// 测试帮助
testImplementation "androidx.room:room-testing:$room_version"
}
-
创建实体类
创建Person
类
import androidx.room.Entity;
import androidx.room.Ignore;
import androidx.room.PrimaryKey;
@Entity
public class Person {
@PrimaryKey(autoGenerate = true)
public int id; // 自增ID,不做事务处理
private int personId; // 本次主键ID。
private long createTime; // 创建时间(时间戳)
public String realName; // 姓名
public int sex = 0; // 性别(0:女,1:男)默认为女
public long birthday; // 生日(时间戳)
public String phone = ""; // 手机号
public String country = ""; // 国家Str
public String provinceStr = ""; // 省Str
public String cityStr = ""; // 市Str
public String address = ""; // 详细地址
@Ignore
public String nickname; //@Ignore 此属性不在数据库生产列
}
}
- 使用
@Entity
对类进行注释。- 使用
@ PrimaryKey
对主键进行注释。
-
设置主键
@PrimaryKey(autoGenerate = true)
public int id; // 自增ID,不做事务处理
-
设置 tableName or name 属性
@Entity(tableName = "PersonTable") // 在数据库中,表名称为:PersonTable
public class Person {
@PrimaryKey(autoGenerate = true)
public int id; // 自增ID,不做事务处理
private int personId; // 本次主键ID。
private long createTime; // 创建时间(时间戳)
@ColumnInfo(name = "name")
public String mName; //@ColumnInfo 在数据库中 mName => name
}
- 在数据库中,表名称为:
PersonTable
。- 在数据库中,
mName
的字段用name
表示,mName => name
。
-
忽略字段
@Ignore //@Ignore 此属性不在数据库生产列
public String nickname;
nickname
字段不参与数据库存储。
-
创建数据访问对象 (DAO)进行增删改查
- DAO 负责定义访问数据库的方法。
- 每个 DAO 都包含提供对应用程序数据库的抽象访问的方法。
- 在编译时,Room 会自动生成您定义的 DAO 的实现。
- 将 DAO 定义为接口或抽象类。
创建DaoPerson
类
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 DaoPerson {
// 新增单个实体
@Insert
void insert(Person person);
// 新增多个实体
@Insert
void insertList(List<Person> person);
// 删除数据
@Delete
void delete(Person person);
@Query("DELETE FROM Person WHERE personId= :personId")
void delete(String personId);
// 更新数据
@Update
void update(Person person);
// 查询数据
// 编写自己的 SQL 查询(query)方法
@Query("SELECT * FROM Person ORDER BY createTime DESC")
List<Person> queryAll();
@Query("SELECT * FROM Person WHERE personId = : personId")
Person queryByPersonId(int personId);
}
创建数据库Room基础类
创建AppBaseDatabase
类
import androidx.room.Database;
import androidx.room.RoomDatabase;
@Database(
entities = { Person.class,Student.class },
version = 1,
exportSchema = false
)
public abstract class AppBaseDatabase extends RoomDatabase {
public abstract DaoPerson daoPerson();
public abstract DaoStudent daoStudent();
}
- 该类必须使用
@Database
注释进行注释。该注释包括一个实体数组,该数组列出了与数据库关联的所有数据实体。- 该类必须是扩展
RoomDatabase
的抽象类。- 对于与数据库关联的每个
DAO
类,数据库类必须定义一个具有零参数并返回DAO
类实例的抽象方法。
创建数据库业务管理类
创建AppDataBaseManager
类
import android.content.Context;
import androidx.room.Room;
import java.util.List;
public class AppDataBaseManager {
private String DB_NAME = "myDatabase.db";
private static AppBaseDatabase database;
private volatile static AppDataBaseManager INSTANCE = null;
public static AppDataBaseManager getInstance(Context context) {
if (INSTANCE == null) {
INSTANCE = new AppDataBaseManager(context);
}
return INSTANCE;
}
public AppDataBaseManager(Context context) {
database = Room.databaseBuilder(context, AppBaseDatabase.class, DB_NAME)
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.build();
}
public <T> void insertList(List<T> list) {
if (list != null && list.size() > 0) {
if (list.get(0) instanceof Person) {
database.daoPerson().insertList((List<Person>) list);
} else if (list.get(0) instanceof Student) {
database.daoStudent().insertList((List<Student>) list);
}
}
}
// 增
public void insertTask(Object obj) {
if (obj instanceof Person) {
database.daoPerson().insert((Person) obj);
} else if (obj instanceof Student) {
database.daoStudent().insert((Student) obj);
}
}
// 删
public void deletePerson(final Person person) {
database.daoPerson().delete(person);
}
// 改
public void updatePerson(final Person person) {
database.daoPerson().update(person);
}
// 查
public Person getPersonByPersonId(int personId) {
return database.daoPerson().queryByPersonId(personId);
}
}
在Activity类中使用Room
在MainActivity
中
// 模拟数据插入
Person person = new Person();
person.personId = 10086;
person.realName = "一蓑烟雨任平生";
AppDataBaseManager.getInstance(this).insertTask(person);
// 模拟查询
List<Person> resultList = AppDataBaseManager.getInstance(this).getPersonByPersonId(10086);
- 这只是一个简单的使用,剩下的业务逻辑看各自项目进行处理了。
Room数据库升级
TODO
网友评论