Room在SQLite之上提供了一个抽象层来访问数据库,可以在充分利用SQLite强大功能的同时对数据库进行流畅的访问。
优点
- 减少了写大量代码来在SQL查询和Java数据对象之间进行转换。
- 数据层改变自动更新SQL查询。减少了查询过程的耗时。
使用
添加依赖
compile "android.arch.persistence.room:runtime:1.0.0-beta1"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0-beta1"
可能发生的错误
Error:Failed to resolve: android.arch.persistence.room:runtime:1.0.0-beta1
Error:Failed to resolve: annotationProcessor
解决办法:
往工程级别下的gradle文件里添加google的maven仓库
allprojects {
repositories {
jcenter()
maven {
url 'https://maven.google.com'
}
}
}
Room三要素:
- Dao:用来处理数据库操作,如增删改查,编译的时候会生成_impl结尾的实现类,实现在DAO中定义的增删改查方法
- Entity:实体类,一个实体类对应一张表
- Database:作为底层连接数据库的主要接入点,它是一个抽象的类,并继承RoomDatabase,编译的时候会自动生成一个_impl结尾的实现类,实现数据库以及表的创建及打开
代码:
Tips:这里使用了RxJava2.0里的Completable以及Maybe用来处理数据库操作,以及ui更新。
为什么用Maybe不用Single?Maybe是发送0个或1个数据,而single是发送一个数据并且结果要么成功要么错误抛异常。
创建一个DAO接口,这个接口主要是提供数据库增删改查方法,编译的时候会生成一个BookDao_Impl的实现类:
BookDao.java
@Dao
public interface BookDao {
//这里使用Maybe
@Query("SELECT * FROM book")
Maybe<List<Book>> getAllBooks();
@Query("SELECT * FROM book where bookid = :id")
Maybe<Book> getBookById(int id);
@Insert
void insertAll(Book... books);
@Delete
void delete(Book book);
@Update
void updateBooks(Book... books);
}
Entity: 一个实体类对应一张表
Book.java
@Entity(tableName = "book")
public class Book {
@PrimaryKey(autoGenerate = true)
private int bookid;
@ColumnInfo(name = "book_name")
private String bookName;
@ColumnInfo(name = "author")
private String author;
public void setAuthor(String author) {
this.author = author;
}
public String getAuthor() {