欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android官方数据库框架Room简介

程序员文章站 2022-05-14 13:05:54
...

本文参考:使用room将数据保存到本地

Room是什么

Room是Android于2017年推出的官方数据库。Room持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。
Android官方数据库框架Room简介

它可以在运行应用的设备上创建应用数据的缓存,没有网的时候也可以看这些缓存下来的数据。

Room怎么用

Room包含3个主要组件:

  • 数据库:包含数据库持有者,并作为应用已保留的款关系型数据的底层连接的主要接入点。使用@Database注释的类应满足以下条件
    • 扩展RoomDatabase的抽象类。
      在注释中添加与数据库关联的实体列表。
    • 包含具有0个参数且返回使用@Dao注释的类的抽象方法。
      在运行时,您可以通过调用Room.databaseBuilder()或
      Room. inMemoryDatabaseBuilder()获取Database 的实例。
  • Entity: 表示数据库中的表。
  • DAO:包含用于访问数据库的方法。
    Android官方数据库框架Room简介

使用Room要先声明依赖:

在应用或模块的 build.gradle 文件中添加所需工件的依赖项:
Android官方数据库框架Room简介

dependencies {
implementation "androidx.room:room-runtime:$room_version"//写代码的有一个库
annotationProcessor "androidx.room:room-compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor
//注解处理器

// Test helpers
testImplementation "androidx.room:room-testing:$room_version"
implementation 'androidx.recyclerview:recyclerview:1.1.0'

}

接着创建一个Entity的Java类:(以下用word举例)

@Entity
public class Word  {
    @PrimaryKey(autoGenerate = true)
    private int id;

    @ColumnInfo(name = "english_word")
    private String word;
    @ColumnInfo(name = "chinese_meaning")
    private String chinesemeaning;

    public Word(String word,String chinesemeaning) {
        this.chinesemeaning = chinesemeaning;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getWord() {
        return word;
    }

    public void setWord(String word) {
        this.word = word;
    }

    public String getChinesemeaning() {
        return chinesemeaning;
    }

    public void setChinesemeaning(String chinesemeaning) {
        this.chinesemeaning = chinesemeaning;
    }
}

然后就可以开始准备Dao(Database access object)了
它是一个接口,里面主要是你想对数据的操作方法:

@Dao   //Database access object
public interface WordDao {
    @Insert //增加
    //void insertWords(Word word);传入一个参数
    void insertWords(Word... words);//传入多个参数

    @Update
    void updateWords(Word... words);

    @Delete
    void daleteWords(Word... words);

    @Query("DELETE FROM WORD")
    void deleteAllWords();

    @Query("SELECT * FROM WORD ORDER BY ID DESC")
    List<Word> getAllWords();
}

这里只举例了一个entity的情况,要是有多个entity,则要写多个Dao。

然后我们用一个继承了RoomDatabase的抽象类WordDatabase来获得Dao中的方法

@Database(entities = {Word.class},version=1,exportSchema = false)
public abstract class WordDatabase extends RoomDatabase {
    public abstract WordDao getWordDao();

}

在MainActivity中我们通过

wordDatabase = Room.databaseBuilder(this,WordDatabase.class,"word_database")
        .build();

来获得我们建立的数据库的实例。