这篇文章是对上篇文章的优化。增加两个类,一个viewmodel管理界面数据,一个仓库类存放类。
1、Room本身支持liveData,使用liveData,我们就可以不用每次对页面进行刷新 *** 作(自己写的页面刷新函数 )。我们可以用observe来观察它是否发生改变,如果改变则进行页面改变。
2、在Database改成Singleton,因为在database构造实例是非常消耗资源的,所有我们只让它构造一个实例,节省资源
3、改变线程。上一篇文章数据库的 *** 作是在主线程,这是不对的,应该把它放到工作线程。我们可以用AsyncTask。要用AsyncTask对数据库进行 *** 作,就需要定义多个类来继承AsyncTask这个抽象类。
实体类:
package com.example.roomtest;import androIDx.room.ColumnInfo;import androIDx.room.Entity;import androIDx.room.PrimaryKey;@Entity // 实体类public class Word { @PrimaryKey(autoGenerate = true) // 将ID设置为主键,并且自增 private int ID; @ColumnInfo(name = "English") // 设置每列的名称 private String English_word; @ColumnInfo(name = "Chinese") private String Chinese_meaning; // 主键不用构造函数 public Word(){} public Word(String english_word, String chinese_meaning) { English_word = english_word; Chinese_meaning = chinese_meaning; } public voID setID(int ID){ this.ID = ID; } public int getID() { return ID; } public String getEnglish_word() { return English_word; } public voID setEnglish_word(String english_word) { English_word = english_word; } public String getChinese_meaning() { return Chinese_meaning; } public voID setChinese_meaning(String chinese_meaning) { Chinese_meaning = chinese_meaning; }}
Dao:
package com.example.roomtest;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 // 访问数据库 *** 作的接口 Database access objectpublic interface WordDao { //我们所有对数据库的 *** 作都在Dao里声明 @Insert // 这些修饰词会在编译时候生成代码 voID insertWords(Word... words); // 如果是一个参数就写 Word word,多个参数就这样写 @Update voID updataWords(Word... words); @Delete voID deleteWords(Word... words); @query("DELETE FROM WORD") voID deleteallWords(); @query("SELECT * FROM WORD ORDER BY ID DESC") // 获取所有的WORD,并且按照ID降序排序 liveData<List<Word>> getAllWordslive();}
Database:
package com.example.roomtest;import androID.content.Context;import androIDx.room.Database;import androIDx.room.Room;import androIDx.room.RoomDatabase;// singleton/* 这里有个参数,第一个参数entitIEs是一个集合,因为只有一个实体类,如果有多个可以逗号隔开 第二个参数是version(版本):每一次数据库的结构发生改变,版本都得改变 第三个参数是生成数据库表:这里先选择false */@Database(entitIEs = {Word.class},version = 1,exportSchema = false)public abstract class WordDatabase extends RoomDatabase { private static WordDatabase INSTANCE; // 因为需要一个Context,所有我们得传来一个Context static synchronized WordDatabase getDatabase(Context context){ if(INSTANCE==null){ INSTANCE = Room.databaseBuilder(context.getApplicationContext(), WordDatabase.class, "word_database") .allowMainThreadQuerIEs().build(); } return INSTANCE; } public abstract WordDao getWordDao();}
viewmodel:
package com.example.roomtest;import androID.app.Application;import androID.os.AsyncTask;import androIDx.annotation.NonNull;import androIDx.lifecycle.AndroIDviewmodel;import androIDx.lifecycle.liveData;import java.util.List;public class Wordviewmodel extends AndroIDviewmodel { private WordRepository wordRepository; public Wordviewmodel(@NonNull Application application) { super(application); wordRepository = new WordRepository(application); } public liveData<List<Word>> getAllWordlive() { return wordRepository.getAllWordlive(); } // 定义类的接口-- 插入 public voID insertWords(Word...words){ wordRepository.insertWords(words); } // 定义类的接口-- 删除 public voID deleteWords(Word...words){ wordRepository.deleteWords(words); } // 定义类的接口-- 清空 public voID deleteallWords(){ wordRepository.deleteallWords(); } // 定义类的接口-- 修改 public voID updataWords(Word...words){ wordRepository.updataWords(words); }}
Repository:
package com.example.roomtest;import androID.content.Context;import androID.os.AsyncTask;import androIDx.lifecycle.liveData;import java.util.List;public class WordRepository { private liveData<List<Word>> allWordlive; private WordDao wordDao; public WordRepository(Context context) { WordDatabase wordDatabase = WordDatabase.getDatabase(context.getApplicationContext()); wordDao = wordDatabase.getWordDao(); allWordlive = wordDao.getAllWordslive(); } public liveData<List<Word>> getAllWordlive() { return allWordlive; } // 定义类的接口-- 插入 public voID insertWords(Word...words){ new InsertAsyncTask(wordDao).execute(words); } // 定义类的接口-- 删除 public voID deleteWords(Word...words){ new DeleteAsyncTask(wordDao).execute(words); } // 定义类的接口-- 清空 public voID deleteallWords(){ new DeleteallAsyncTask(wordDao).execute(); } // 定义类的接口-- 修改 public voID updataWords(Word...words){ new UpdataAsyncTask(wordDao).execute(words); } // 插入类 static class InsertAsyncTask extends AsyncTask<Word,VoID,VoID> { private WordDao wordDao; public InsertAsyncTask(WordDao wordDao) { this.wordDao = wordDao; } // 将在主线程的工作放到后台来执行 @OverrIDe protected VoID doInBackground(Word... words) { wordDao.insertWords(words); return null; } } // 删除类 static class DeleteAsyncTask extends AsyncTask<Word,VoID,VoID> { private WordDao wordDao; public DeleteAsyncTask(WordDao wordDao) { this.wordDao = wordDao; } // 将在主线程的工作放到后台来执行 @OverrIDe protected VoID doInBackground(Word... words) { wordDao.deleteWords(words); return null; } } // 清空类 static class DeleteallAsyncTask extends AsyncTask<VoID,VoID,VoID> { private WordDao wordDao; public DeleteallAsyncTask(WordDao wordDao) { this.wordDao = wordDao; } // 将在主线程的工作放到后台来执行 @OverrIDe protected VoID doInBackground(VoID... voIDs) { wordDao.deleteallWords(); return null; } } // 修改类 static class UpdataAsyncTask extends AsyncTask<Word,VoID,VoID> { private WordDao wordDao; public UpdataAsyncTask(WordDao wordDao) { this.wordDao = wordDao; } // 将在主线程的工作放到后台来执行 @OverrIDe protected VoID doInBackground(Word... words) { wordDao.updataWords(words); return null; } }}
运行结果:
总结
以上是内存溢出为你收集整理的android----Room数据库的 *** 作(2)全部内容,希望文章能够帮你解决android----Room数据库的 *** 作(2)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)