Android-Jetpack中Room使用
7 Nov 2018
最近在学习使用jetpack里的组件,本项目学习Room模块。
Room是数据库框架,更方便、简单地操作数据库。
相关文档:
Room官方说明:https://developer.android.com/topic/libraries/architecture/room
Room官方文档:
https://developer.android.com/training/data-storage/room/
Room实例教学:
https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#0
Room实例代码:
https://github.com/googlecodelabs/android-room-with-a-view
本文章代码:
https://github.com/pulque/WordNotes
类说明:
1.WelcomeActivity
开始页面,显示文字列表。添加按钮打开添加页面。2.NewWordActivity
添加文字页面,点击保存,把文字返回给列表页面进行添加。3.WordViewModel
缓存数据,并监听数据变化。4.WordListAdapter
列表适配器,使用RecyclerView展示数据。5.WordRoomDatabase
数据库创建类,并提供操作Dao的实例。6.WordRepository
通过WordRoomDatabase提供的Dao实例,操作数据,查询、插入等。7.WordDao
提供表操作的接口,包含数据库执行语句。8.Word
表结构定义对象。Room相关类详细说明:
1.Word
@Entity(tableName = "word_table") public class Word { @PrimaryKey @NonNull @ColumnInfo(name = "word") private String mWord; @NonNull @ColumnInfo(name = "chinese") private String mChinese; public Word(@NonNull String word, @NonNull String chinese) { this.mWord = word; this.mChinese = chinese; } public String getWord() { return this.mWord; } public String getChinese() { return mChinese; } }解释:
@Entity在数据库中表的名字。
@PrimaryKey主键
@ColumnInfo在表中字段的名字
GET方法必须定义,数据库需要此方法对变量进行操作。
2.WordDao
@Dao public interface WordDao { @Insert(onConflict = OnConflictStrategy.REPLACE) void insert(Word word); @Query("DELETE FROM word_table") void deleteAll(); @Query("SELECT * from word_table ORDER BY word ASC") LiveData<List<Word>> getAllWords(); }解释:
@Dao表操作标识。
@Insert插入操作,可以不提供执行语句。
@Query语句执行标识,需添加执行语句。
3.WordRoomDatabase
去掉添加默认数据部分。@Database(entities = {Word.class}, version = 1) public abstract class WordRoomDatabase extends RoomDatabase { private static volatile WordRoomDatabase INSTANCE; static WordRoomDatabase getDatabase(final Context context) { if (INSTANCE == null) { synchronized (WordRoomDatabase.class) { if (INSTANCE == null) { // Create database here INSTANCE = Room.databaseBuilder( context.getApplicationContext(), WordRoomDatabase.class, "word_database") .build(); } } } return INSTANCE; } public abstract WordDao wordDao(); }解释:
@Database标识所包含的表喝数据库版本等信息。
创建数据库,并保存单例,提供表操作接口。
4.WordRepository
数据异步操作,为WordViewModel提供数据支持。public class WordRepository { private WordDao mWordDao; private LiveData<List<Word>> mAllWords; public WordRepository(Application application) { WordRoomDatabase db = WordRoomDatabase.getDatabase(application); mWordDao = db.wordDao(); mAllWords = mWordDao.getAllWords(); } public LiveData<List<Word>> getAllWords() { return mAllWords; } public void insert(Word word) { new insertAsyncTask(mWordDao).execute(word); } private static class insertAsyncTask extends AsyncTask<Word, Void, Void> { private WordDao mAsyncTaskDao; insertAsyncTask(WordDao dao) { mAsyncTaskDao = dao; } @Override protected Void doInBackground(final Word... params) { mAsyncTaskDao.insert(params[0]); return null; } } }解释:
使用AsyncTask进行异步操作。
使用Dao进行表数据操作。
总结:
WordRepository通过数据库WordRoomDatabase提供的WordDao,给WordViewModel提供数据。
WordViewModel通知UI进行数据显示更新。
进阶:
使用RxAndroid2代替AsyncTask进行异步操作。Room复杂操作。
进阶参考:
https://github.com/googlesamples/android-architecture-components/
https://codelabs.developers.google.com/?cat=Android