Room是一个对象关系映射(ORM)库。Room抽象了SQLite的使用,可以在充分利用SQLite的同时访问流畅的数据库。
Room由三个重要的组件组成:Database、Entity、DAO
-
Database:包含数据库持有者,并作为与应用持久关联数据的底层连接的主要访问点。而且Database对应的类必须满足下面几个条件:
1. 必须是abstract类而且的extends RoomDatabase。
3. 必须在类头的注释中包含与数据库关联的实体列表(Entity对应的类)。
4. 包含一个具有0个参数的抽象方法,并返回用@Dao注解的类。
在运行时,你可以通过Room.databaseBuilder() 或者 Room.inMemoryDatabaseBuilder()获取Database实例。 -
Entity:代表数据库中某个表的实体类。
-
DAO:包含用于访问数据库的方法。
Room的使用添加依赖
implementation "android.arch.persistence.room:runtime:1.1.1"
annotationProcessor "android.arch.persistence.room:compiler:1.1.1"
Enity(实体)
每个Entity代表数据库中某个表的实体类。默认情况下Room会把Entity里面所有的字段对应到表上的每一列。
@Entity
public class Anime {
@PrimaryKey
private String name;
private String type;
private String author;
private int price;
(getter、setter方法)
}
@Entity注解包含的属性有:
- tableName:设置表名字。默认是类的名字。
- indices:设置索引。
- inheritSuperIndices:父类的索引是否会自动被当前类继承。
- primaryKeys:设置主键。
- foreignKeys:设置外键。
DAO(数据访问对象)
这个组件代表了作为DAO的类或者接口。DAO是Room的主要组件,负责定义访问数据库的方法。Room使用过程中一般使用抽象DAO类来定义数据库的CRUD操作。DAO可以是一个接口也可以是一个抽象类。如果它是一个抽象类,它可以有一个构造函数,它将RoomDatabase作为其唯一参数。Room在编译时创建每个DAO实。
DAO里面所有的操作都是依赖方法来实现的。
@Dao
public interface BookDao {
@Query("SELECT * FROM Book")
List<Book> getAllBooks(); //加载所有书籍数据
@Query("SELECT * FROM Book WHERE name = :name")
Book loadBookByName(String name); //根据名字加载书籍
@Insert
void insertOneBook(Book book); //插入一条书籍信息
@Insert
void insertMultiBooks(Book... books); //插入多条书籍信息
@Update(onConflict = OnConflictStrategy.REPLACE)
int updateUsers(Book... books); //更新书籍信息,当有冲突时则进行替代
@Delete
void deleteBook(Book book);
Database(数据库)
@Database注解可以用来创建数据库的持有者。该注解定义了实体列表,该类的内容定义了数据库中的DAO列表。这也是访问底层连接的主要入口点。注解类应该是抽象的并且扩展自RoomDatabase。
@Database(entities = {Book.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract BookDao bookDao();
}
创建BookDatabase实例(AppDatabase)。这里我们把BookDatabase实例的创建放在Application里面。
public class MyApp extends Application {
private static MyApp mInstance;
private AppDatabase appDB;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
appDB = Room.databaseBuilder(this,AppDatabase.class,"book_info")
.addMigrations()
.build();
}
public static MyApp getInstance(){
return mInstance;
}
public AppDatabase getAppDB(){
return appDB;
}
}
操作数据库进行增删改查
public class MainActivity extends AppCompatActivity {
private Button button;
private Button button2;
private Button button3;
private Button button4;
private Button button5;
private Button button6;
private BookDao bookDao;
private TextView tvResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bookDao.insertOneBook(createOneBook());
}
});
button2 = findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bookDao.deleteBook(queryOneRecord());
queryAllRecord();
}
});
button3 = findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
updateRecord();
}
});
button4 = findViewById(R.id.button4);
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
queryAllRecord();
}
});
button5 = findViewById(R.id.button5);
button5.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bookDao.insertMultiBooks(createMutilBook());
}
});
button6 = findViewById(R.id.button6);
button6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
queryOneRecord();
}
});
tvResult = findViewById(R.id.tv_result);
//拿到数据库操作对象
bookDao = MyApp.getInstance().getAppDB().bookDao();
}
private void updateRecord() {
Book book = queryOneRecord();
book.setPrice(100);
bookDao.updateUsers(book);
queryAllRecord();
}
private Book queryOneRecord() {
Book book = bookDao.loadBookByName("******");
tvResult.setText(book.toString());
return book;
}
private void queryAllRecord() {
List<Book> bookList = bookDao.getAllBooks();
tvResult.setText(bookList.toString());
}
private Book createOneBook(){
Book book = new Book();
book.setName("*****");
book.setType("****");
book.setAuthor("***");
book.setPrice(13);
return book;
}
private Book[] createMutilBook(){
Book[] books = new Book[3];
Book book = new Book();
book.setName("*****");
book.setType("****");
book.setAuthor("***");
book.setPrice(13);
Book book1 = new Book();
book1.setName("*****");
book1.setType("****");
book1.setPrice(13);
Book book2 = new Book();
book2.setName("*****");
book2.setType("****8");
book2.setAuthor("***");
book2.setPrice(13);
books[0] =book;
books[1] = book1;
books[2] = book2;
return books;
}
}
运行成功可以在这里查看数据库
详细Room参考链接:https://www.jianshu.com/p/3e358eb9ac43