概述
android系统中的数据库SQLite使用起来并不方便,早期学习的时候一直很讨厌使用,后来出现了GreenDao、OrmLite、Realm极大的方便了android开发中的数据持久化。去年google推出了架构组件,其中room就是一款orm框架。
添加Room依赖库
详细查看room配置
1.添加google的maven库,在project的gradle文件:
allprojects {
repositories {
jcenter()
google() // 添加谷歌maven库
}
}
2.添加架构组件依赖库,在module的gradle文件:
dependencies {
// Room (use 1.1.0-alpha2 for latest alpha)
implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
// Test helpers for Room
testImplementation "android.arch.persistence.room:testing:1.0.0"
}
1.以上为gradle插件3.0
2.如果是kotlin项目,确保用kapt代替annotationProcessor,同时也要添加kotlin-kapt插件
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
3.为room添加rxjava支持库
dependencies {
// RxJava support for Room (use 1.1.0-alpha1 for latest alpha)
implementation "android.arch.persistence.room:rxjava2:1.0.0"
}
4.Room @Dao查询中添加对Guava的Optional和ListenableFuture类型的支持。
dependencies {
// Guava support for Room
implementation "android.arch.persistence.room:guava:1.1.0-alpha2"
}
5.和LiveData一起使用
// ReactiveStreams support for LiveData
implementation "android.arch.lifecycle:reactivestreams:1.0.0"
Room三大组件
Room中有三个主要组件。
- Database: 用这个组件创建一个数据库。注解定义了一系列entities,并且类中提供一系列Dao的抽象方法,也是下层主要连接的访问点。注解的类应该是一个继承 RoomDatabase的抽象类。在运行时,你能通过调用Room.databaseBuilder()或者 Room.inMemoryDatabaseBuilder()获得一个实例
- Entity: 用这个组件创建表,Database类中的entities数组通过引用这些entity类创建数据库表。每个entity中的字段都会被持久化到数据库中,除非用@Ignore注解
DAO: 这个组件代表了一个用来操作表增删改查的dao。Dao 是Room中的主要组件,负责定义访问数据库的方法。被注解@Database的类必须包含一个没有参数的且返回注解为@Dao的类的抽象方法。在编译时,Room创建一个这个类的实现。
Entity类能够有一个空的构造函数(如果dao类能够访问每个持久化的字段)或者一个参数带有匹配entity中的字段的类型和名称的构造函数
如下代码片段包含一个简单的三大组件使用例子:
User.java
@Entity
public class User {
@PrimaryKey
private int uid;
@ColumnInfo(name = "first_name")
private String firstName;
@ColumnInfo(name = "last_name")
private String lastName;
// Getters and setters are ignored for brevity,
// but they're required for Room to work.
}
UserDao.java
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAll();
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
List<User> loadAllByIds(int[] userIds);
@Query("SELECT * FROM user WHERE first_name LIKE :first AND "
+ "last_name LIKE :last LIMIT 1")
User findByName(String first, String last);
@Insert
void insertAll(User... users);
@Delete
void delete(User user);
}
AppDatabase.java
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
通过以上文件,可以使用如下代码创建一个数据库实例:
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name").build();
生成数据库实例的具体操作:
Room.databaseBuilder(getApplicationContext(),
RoomDemoDatabase.class, "database_name")
.addCallback(new RoomDatabase.Callback() {
//第一次创建数据库时调用,但是在创建所有表之后调用的
@Override
public