android----Room数据库的 *** 作(2)

android----Room数据库的 *** 作(2),第1张

概述这篇文章是对上篇文章的优化。增加两个类,一个ViewModel管理界面数据,一个仓库类存放类。1、Room本身支持LiveData,使用LiveData,我们就可以不用每次对页面进行刷新 *** 作(自己写的页面刷新函数)。我们可以用observe来观察它是否发生改变,如果改变则进行页面改变。2、在Databa

 这篇文章是对上篇文章的优化。增加两个类,一个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)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/999717.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存