当前位置: 首页 > news >正文

Room (二) 进阶和完善

1. Word 类不做修改

@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(String word, String chineseMeaning) {
        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;
    }
}

2. 修改 WordDao

@Dao //Database access object
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>> getAllWordsLive();
    //List<Word> getAllWords();
}

3. 修改 WordDatabase,只允许生成一个实例

//singleton 只允许生成一个实例
@Database(entities = {Word.class}, version = 1, exportSchema = false)
public abstract class WordDatabase extends RoomDatabase {
    private static WordDatabase INSTANCE;

    //synchronized: 解决多个线程下调用,创建多个实例问题
    static synchronized WordDatabase getDatabase(Context context) {
        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(), WordDatabase.class, "word_database")
                    .build();
        }
        return INSTANCE;
    }

    public abstract WordDao getWordDao();
}

4. 创建 Repository:仓库 获取数据的意思, 代码进行归类

class WordRepository {
    private WordDao wordDao;
    private LiveData<List<Word>> allWordsLive;

    WordRepository(Context context) {
        WordDatabase wordDatabase = WordDatabase.getDatabase(context);
        wordDao = wordDatabase.getWordDao();
        allWordsLive = wordDao.getAllWordsLive();
    }

    LiveData<List<Word>> getAllWordsLive() {
        return allWordsLive;
    }

    void insertWords(Word... words) {
        new InsertAsyncTask(wordDao).execute(words);
    }

    void updateWords(Word... words) {
        new UpdateAsyncTask(wordDao).execute(words);
    }

    void deleteWords(Word... words) {
        new DeleteAsyncTask(wordDao).execute(words);
    }

    void deleteAllWords() {
        new DeleteAllAsyncTask(wordDao).execute();
    }

    static class InsertAsyncTask extends AsyncTask<Word, Void, Void> {
        private WordDao wordDao;

        InsertAsyncTask(WordDao wordDao) {
            this.wordDao = wordDao;
        }

        @Override
        protected Void doInBackground(Word... words) {
            wordDao.insertWords(words);
            return null;
        }
    }

    static class UpdateAsyncTask extends AsyncTask<Word, Void, Void> {
        private WordDao wordDao;

        UpdateAsyncTask(WordDao wordDao) {
            this.wordDao = wordDao;
        }

        @Override
        protected Void doInBackground(Word... words) {
            wordDao.updateWords(words);
            return null;
        }
    }

    static class DeleteAsyncTask extends AsyncTask<Word, Void, Void> {
        private WordDao wordDao;

        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;

        DeleteAllAsyncTask(WordDao wordDao) {
            this.wordDao = wordDao;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            this.wordDao.deleteAllWords();
            return null;
        }
    }
}

5. 创建 ViewModel

public class WordViewModel extends AndroidViewModel {
    private WordRepository wordRepository;

    public WordViewModel(@NonNull Application application) {
        super(application);
        wordRepository = new WordRepository(application);
    }

    public LiveData<List<Word>> getAllWordsLive() {
        return wordRepository.getAllWordsLive();
    }

    void insertWords(Word... words) {
        wordRepository.insertWords(words);
    }

    void updateWords(Word... words) {
        wordRepository.updateWords(words);
    }

    void deleteWords(Word... words) {
        wordRepository.deleteWords(words);
    }

    void deleteAllWords() {
        wordRepository.deleteAllWords();
    }
}

6. 调用测试

public class MainActivity extends AppCompatActivity {
    TextView textView;
    Button btInsert, btUpdate, btDelete, btClear;
    WordViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textView);
        viewModel = new ViewModelProvider(this).get(WordViewModel.class);
        viewModel.getAllWordsLive().observe(this, new Observer<List<Word>>() {
            @Override
            public void onChanged(List<Word> words) {
                StringBuilder text = new StringBuilder();
                for (int i = 0; i < words.size(); i++) {
                    Word word = words.get(i);
                    text.append(word.getId()).append(":").append(word.getWord()).append("=").append(word.getChineseMeaning()).append("\n");
                }
                textView.setText(text.toString());
            }
        });

        View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                switch (view.getId()) {
                    case R.id.bt_insert:
                        Word word1 = new Word("Hello", "你好!");
                        Word word2 = new Word("World", "世界!");
                        viewModel.insertWords(word1, word2);
                        break;
                    case R.id.bt_clear:
                        viewModel.deleteAllWords();
                        break;
                    case R.id.bt_update:
                        Word word = new Word("Hi", "嗨");
                        word.setId(51);
                        viewModel.updateWords(word);
                        break;
                    case R.id.bt_delete:
                        Word word_d = new Word("一", "1");
                        word_d.setId(52);
                        viewModel.deleteWords(word_d);
                        break;
                }
            }
        };
        btInsert = findViewById(R.id.bt_insert);
        btClear = findViewById(R.id.bt_clear);
        btUpdate = findViewById(R.id.bt_update);
        btDelete = findViewById(R.id.bt_delete);
        btDelete.setOnClickListener(listener);
        btInsert.setOnClickListener(listener);
        btClear.setOnClickListener(listener);
        btUpdate.setOnClickListener(listener);
    }
}

相关文章:

  • 神经网络模型的实际案例,神经网络模型应用实例
  • 使用stress对服务器进行压力测试
  • 线性阈值(Linear Threshold)模型的原理及代码实现
  • 你不知道的自然语言处理应用场景和挑战
  • Springboot学生选课系统的设计与实现毕业设计源码
  • 直播回顾|应用上容器的最佳实践技术沙龙
  • 【论文阅读】ART-SLAM: Accurate Real-Time 6DoF LiDAR SLAM
  • redis使用zset实现数据库多字段排序的一种方式
  • Elasticsearch ES数据迁移方法及注意事项
  • OPENSQL 2022.9.1
  • Redis集群研究和实践(基于redis 3.2.5)(一)
  • 初等数论总结
  • React(9)-组件引用传递(高级应用)
  • Flink在Window上的开发环境搭建
  • elasticsearch ES新增字段并赋初始值
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【5+】跨webview多页面 触发事件(二)
  • Angular 4.x 动态创建组件
  • codis proxy处理流程
  • Js基础——数据类型之Null和Undefined
  • Vim 折腾记
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 消息队列系列二(IOT中消息队列的应用)
  • 一、python与pycharm的安装
  • 在Unity中实现一个简单的消息管理器
  • 1.Ext JS 建立web开发工程
  • Linux权限管理(week1_day5)--技术流ken
  • 大数据全解:定义、价值及挑战
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • #Z0458. 树的中心2
  • #前后端分离# 头条发布系统
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #在 README.md 中生成项目目录结构
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (2015)JS ES6 必知的十个 特性
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (译) 函数式 JS #1:简介
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • ***利用Ms05002溢出找“肉鸡
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET命令行(CLI)常用命令
  • @Autowired 与@Resource的区别
  • [] 与 [[]], -gt 与 > 的比较
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [C puzzle book] types