
Room库是对SQLite数据库的抽象,使用上更加方便高效。
它包含以下几部分:
-
Entity:它代表数据库中一条数据(数据库表中的一行)。
-
Dao:包含用于访问数据库的方法。
-
Database:数据库持有者,充当与应用程序持久化的、关系型的数据的底层连接的主要访问点。用
@Database
注解的类应满足以下条件:
1.是一个继承 RoomDatabase 的抽象类。
2.在注释中包含与数据库相关联的实体列表。
3.包含一个具有0个参数的抽象方法,并返回用@Dao注释的类。
4.在运行时,可以通过调用Room.databaseBuilder()或Room.inMemoryDatabaseBuilder()获取数据库实例。 -
Migration:数据库版本迁移,数据发生改变时就需要从低版本迁移到高版本。
-
AsyncTask:开启子线程。数据库操作比较耗时,需开启子线程。
-
Repository:将数据访问放到这一层,目的是与应用程序解耦。
-
RecyclerView、RecyclerView Adapter
文中的Demo:
一. Entity、Dao、Database、liveData
接下来使用Entity、Dao、Database来创建一个数据库工程,并结合ViewModel中的liveData。
1. 要使用room,先根据自己的需要添加相应的依赖
在应用或模块的 build.gradle 文件中添加所需工件的依赖项:
dependencies {
def room_version = "2.2.5"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
// optional - RxJava support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// optional - Test helpers
testImplementation "androidx.room:room-testing:$room_version"
}
2. 分别创建Entity、Dao、Database文件
Entity:
package com.example.roomdemo;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity
public class Word {
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo(name = "English")
private String word;
@ColumnInfo(name = "chinese")
private String chinese;
public Word(String word, String chinese) {
this.word = word;
this.chinese = chinese;
}
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 getChinese() {
return chinese;
}
public void setChinese(String chinese) {
this.chinese = chinese;
}
}
Dao:
package com.example.roomdemo;
import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import java.util.List;
@Dao
public interface WordDao {
@Insert
void insertWords(Word... words);
@Update
void updateWords(Word... words);
@Delete
void deleteWords(Word... words);
@Query("DELETE FROM WORD")
void deleteAllWords();
@Query("SELECT * FROM WORD ORDER BY ID DESC")
LiveData<List<Word>> getAllWords();
}
Database:
package com.example.roomdemo;
import androidx.room.Database;
import androidx.room.RoomDatabase;
@Database(entities = {Word.class}, version = 1, exportSchema = false)
public abstract class WordDatabase extends RoomDatabase {
public abstract WordDao getWordDao();
}
在MainActivity中的使用:
package com.example.roomdemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;
import androidx.room.Room;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
WordDatabase wordDatabase;
WordDao wordDao;
TextView textView;
Button buttonInsert, buttonDelete, buttonUpdate, buttonClear;
LiveData<List<Word>> allWordsLive;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wordDatabase = Room.databaseBuilder(this, WordDatabase.class, "word_database").allowMainThreadQueries().build();
wordDao = wordDatabase.getWordDao();
textView = findViewById(R.id.textView);
allWordsLive = wordDao.getAllWords();
allWordsLive.observe(this, new Observer<List<Word>>() {
@Override
public void onChanged(List<Word> words) {
StringBuilder text = new StringBuilder();
for (Word word: words) {
text.append(word.getId()).append("、").append(word.getWord()).append(":").append(word.getChinese()).append("\n");
}
textView.setText(text);
}
});
buttonInsert = findViewById(R.id.button1);
buttonDelete = findViewById(R.id.button2);
buttonUpdate = findViewById(R.id.button3);
buttonClear = findViewById(R.id.button4);
buttonInsert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Word word1 = new Word("Hello", "你好");
Word word2 = new Word("World", "世界");
wordDao.insertWords(word1, word2);
}
});
buttonDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Word word = new Word("aa", "bb");
word.setId(30);
wordDao.deleteWords(word);
}
});
buttonUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Word word = new Word("Thanks", "谢谢");
word.setId(29);
wordDao.updateWords(word);
}
});
buttonClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
wordDao.deleteAllWords();
}
});
}
}
界面就不说,可以看RoomLiveDataDemo。
网友评论