この記事のリファレンス:部屋を使用してデータをローカルに保存する
部屋とは
Roomは、2017年にAndroidによってリリースされた公式データベースです。部屋の永続化ライブラリはSQLiteに基づく抽象化レイヤーを提供し、ユーザーはSQLiteの強力な機能を十分に活用しながら、より堅牢なデータベースアクセスメカニズムを利用できます。
アプリケーションを実行しているデバイス上にアプリケーションデータのキャッシュを作成でき、インターネットがないときにキャッシュされたデータを表示できます。
部屋の使い方
部屋には3つの主要コンポーネントが含まれています。
- データベース:データベースホルダーが含まれ、予約されたリレーショナルデータの基になる接続のメインアクセスポイントとして機能します。@Databaseで注釈が付けられたクラスは、次の条件を満たす必要があります
- RoomDatabaseの抽象クラスを拡張します。
データベースに関連付けられているエンティティのリストをコメントに追加します。 - パラメータが0で、@ Daoで注釈されたクラスを返す抽象メソッドが含まれます。
実行時に、Room.databaseBuilder()またはRoom。inMemoryDatabaseBuilder()を呼び出すこと
により、データベースのインスタンスを取得できます。
- RoomDatabaseの抽象クラスを拡張します。
- エンティティ:データベース内のテーブルを表します。
- DAO:データベースにアクセスするためのメソッドが含まれています。
Roomを使用するには、まず依存関係を宣言する必要があります。
アプリまたはモジュールのbuild.gradleファイルに必要なアーティファクトの依存関係を追加します。
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'
}
次に、エンティティJavaクラスを作成します(次の例では単語を使用しています)。
@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(データベースアクセスオブジェクト)の準備を開始できます。
これは、主にデータを操作するメソッドを含むインターフェイスです。
@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();
}
これは1つのエンティティの場合のみであり、複数のエンティティがある場合、複数の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();
作成したデータベースのインスタンスを取得する。