Room(一)
添加依赖
dependencies {
def room_version = "2.2.3"
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"
}
需要先添加远程仓库
allprojects {
repositories {
google()
mavenCentral()
jcenter()
}
}
创建entity、Dao、Database
在创建这些类时使用注解以声明。
Entity:
@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(int id, String word, String chineseMeaning) {
this.id = id;
this.word = word;
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 ... words);
@Update
int updateWords(Word... words);
@Delete
void deleteWords(Word... words);
@Query("DELETE FROM WORD")
void deleteAllWords();
@Query("SELECT * FROM WORD ORDER BY ID desc")
List<Word> getAllWords();
}
Database
@Database(entities = {Word.class},version = 1,exportSchema =false)
public abstract class WordDatabase extends RoomDatabase {
public abstract WordDao getWordDao();
}
我们并没有去重写dao接口中的方法,也没有重写database类中的get方法,这些过程都是Room的注解帮助我们完成的,这看上去莫名其妙,其实确实很莫名其妙。
以dao中的方法为例,Room帮我们自动写全了这些方法:
//WordDao_Imp
@Override
public void insertWords(final Word... words) {
__db.assertNotSuspendingTransaction();
__db.beginTransaction();
try {
__insertionAdapterOfWord.insert(words);
__db.setTransactionSuccessful();
} finally {
__db.endTransaction();
}
}
@Override
public void deleteWords(final Word... words) {
__db.assertNotSuspendingTransaction();
__db.beginTransaction();
try {
__deletionAdapterOfWord.handleMultiple(words);
__db.setTransactionSuccessful();
} finally {
__db.endTransaction();
}
}
@Override
public int updateWords(final Word... words) {
__db.assertNotSuspendingTransaction();
int _total = 0;
__db.beginTransaction();
try {
_total +=__updateAdapterOfWord.handleMultiple(words);
__db.setTransactionSuccessful();
return _total;
} finally {
__db.endTransaction();
}
}
@Override
public void deleteAllWords() {
__db.assertNotSuspendingTransaction();
final SupportSQLiteStatement _stmt = __preparedStmtOfDeleteAllWords.acquire();
__db.beginTransaction();
try {
_stmt.executeUpdateDelete();
__db.setTransactionSuccessful();
} finally {
__db.endTransaction();
__preparedStmtOfDeleteAllWords.release(_stmt);
}
}
@Override
public List<Word> getAllWords() {
final String _sql = "SELECT * FROM WORD ORDER BY ID desc";
final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
__db.assertNotSuspendingTransaction();
final Cursor _cursor = DBUtil.query(__db, _statement, false, null);
try {
final int _cursorIndexOfId = CursorUtil.getColumnIndexOrThrow(_cursor, "id");
final int _cursorIndexOfWord = CursorUtil.getColumnIndexOrThrow(_cursor, "english_word");
final int _cursorIndexOfChineseMeaning = CursorUtil.getColumnIndexOrThrow(_cursor, "chinese_meaning");
final List<Word> _result = new ArrayList<Word>(_cursor.getCount());
while(_cursor.moveToNext()) {
final Word _item;
final String _tmpWord;
_tmpWord = _cursor.getString(_cursorIndexOfWord);
final String _tmpChineseMeaning;
_tmpChineseMeaning = _cursor.getString(_cursorIndexOfChineseMeaning);
_item = new Word(_tmpWord,_tmpChineseMeaning);
final int _tmpId;
_tmpId = _cursor.getInt(_cursorIndexOfId);
_item.setId(_tmpId);
_result.add(_item);
}
return _result;
} finally {
_cursor.close();
_statement.release();
}
}
获取、使用database和dao
获取:
//onCreated
wordDatabase= Room.databaseBuilder(this,WordDatabase.class,"WordDatabase")
.allowMainThreadQueries()//强制允许在主线程进行数据库查询
.build();
wordDao=wordDatabase.getWordDao();
直接使用获取的dao,调用其方法就可以进行数据库查询:
//onCreated
bInsert=findViewById(R.id.insert);
bInsert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Word word1=new Word("Hello","你好");
Word word2=new Word("World","世界");
wordDao.insertWords(word1,word2);
updateView();
}
});