使用 Room 将数据保存到本地数据库

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注解包含的属性有:

  1. tableName:设置表名字。默认是类的名字。
  2. indices:设置索引。
  3. inheritSuperIndices:父类的索引是否会自动被当前类继承。
  4. primaryKeys:设置主键。
  5. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值