Room 数据库基础

  • Room 简介
  • 使用Room保存本地数据到数据库中
    • Entity 实体
    • Dao
    • Database
  • 简单案例

Room 简介

Room 持久库提供了一个 SQLite 抽象层,让你访问数据库更加稳健,提升数据库性能。

该库帮助您在运行应用程序的设备上创建应用程序的数据缓存。这个缓存是你的应用程序唯一的真实来源,允许用户查看应用程序中关键信息的一致副本,而不管用户是否有Internet连接。

使用 Room 需要添加依赖:

dependencies {def room_version = "2.2.0-alpha01"implementation "androidx.room:room-runtime:$room_version"annotationProcessor "androidx.room:room-compiler:$room_version" // use kapt for Kotlin// optional - RxJava support for Roomimplementation "androidx.room:room-rxjava2:$room_version"// optional - Guava support for Room, including Optional and ListenableFutureimplementation "androidx.room:room-guava:$room_version"// Test helperstestImplementation "androidx.room:room-testing:$room_version"
}

使用Room保存本地数据到数据库中

Room在SQLite上提供了一个抽象层,以便在发挥SQLite能力的同时允许流畅的数据库访问。

处理复杂的结构化数据的应用程序可以极大地受益于本地数据的持久化。最常见的用例是缓存相关的数据片段。这样,当设备无法访问网络时,用户仍然可以在离线时浏览该内容。在设备返回联机之后,任何用户发起的内容更改都会同步到服务器。

Room有3个主要的组件:

  • Database:包含数据库持有者,并充当与应用程序持久化的、关系型的数据的底层连接的主要访问点。
    用@Database注解的类应满足以下条件:
    是一个继承 RoomDatabase 的抽象类
    在注释中包含与数据库相关联的实体列表。
    包含一个具有0个参数的抽象方法,并返回用@Dao注释的类。
    在运行时,可以通过调用Room.databaseBuilder()或Room.inMemoryDatabaseBuilder()获取数据库实例。

  • Entity:表示数据库内的表。

  • DAO: 包含用于访问数据库的方法。

Entity 实体

@Entity 这个注解是引用了 Room 库后出现的,相当于定义了数据库中的一张表(table)。

我们利用 @PrimaryKey(autoGenerate = true) 设置某个字段为主键,并且自动生长。
@ColumnInfo(name = “english_word”) 给字段设置别名,如果不设置就默认为变量名。

利用 idea 快速生成构造器(id 不需要作为参数,因为id是系统自动生成的)。
利用 idea 快速生成 get 与 set 方法(id 可以写,单没必要)。

建立一个 Word.java 文件,利用注解标记为 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(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;}
}

Dao

Dao 指的是 Database aceess object,即访问数据库操作的接口。我们所有的数据库的操作,都将在这里声明,如增删改查。利用注解功能可以很方便的执行操作。
@Insert 表示插入记录。
@Update 表示修改数据库中的记录。
@Delete 表示删除数据库中记录。
@Query(" ") 中可以写入SQL语句,来执行操作。

声明一个接口文件 WordDao.java,利用注解标记为 Dao,代码如下:

@Dao // Database aceess object 访问数据库操作的接口
public interface WordDao { // 在这里声明数据库的操作,如增删改查@Insertvoid insertWords(Word... word); // 可以传递三个参数@Updatevoid updatWords(Word... words);@Deletevoid deleteWords(Word... words);@Query("DELETE FROM WORD")void deleteAllWords();@Query("SELECT * FROM WORD ORDER BY ID DESC") // 降序排列List<Word> getAllWords();
}

Database

Database 文件必须要继承 androidx.room.RoomDatabase,并且得是抽象类

@Database() 中必须指明 entities ,传入我们之前创建的 entity,这里是个集合,可以传入多个值。
version 作为版本号,当数据库结构发生改变时,数据库版本会增加,以后会配合 Migration 进行数据迁移

建立一个 WordDatabases.java 文件,利用注解标记为 Database,代码如下:

@Database(entities = {Word.class}, version = 1, exportSchema = false)
public abstract class WordDatabase extends RoomDatabase {public abstract WordDao getWordDao(); // 若有多个 Entity,则应该写多个 Dao
}

简单案例

搭建如图界面:

来到 MainActiviry.xml 中,代码如下:
updateView() 是用来刷新界面的,每次对数据库进行操作后,要通过页面来显示效果。
值得注意的是,数据库不允许在主线程中执行,因为加载的资源如果,但是我们可以通过allowMainThreadQueries() 强制允许在主线程执行,在真实开发中不要这么做,这里只是为了演示效果。
Dao 模式与以前学习 JavaEE 时基本类似,所以很好理解。

public class MainActivity extends AppCompatActivity {WordDatabase wordDatabase;WordDao wordDao;TextView textView;Button buttonInsert,buttonUpdate,buttonDelete,buttonClear;@Overrideprotected void onCreate(Bundle savedInstanceState)  {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.textView2);// allowMainThreadQueries() 强制允许在主线程执行,真实开发中不要这么做wordDatabase = Room.databaseBuilder(this,WordDatabase.class,"word_database").allowMainThreadQueries().build();wordDao = wordDatabase.getWordDao();updateView();buttonInsert = findViewById(R.id.buttonInsert);buttonUpdate = findViewById(R.id.buttonUpdate);buttonDelete = findViewById(R.id.buttonDelete);buttonClear = findViewById(R.id.buttonClear);buttonInsert.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Word word1 = new Word("Hello","你好");Word word2 = new Word("World","世界");wordDao.insertWords(word1,word2);updateView();}});buttonClear.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {wordDao.deleteAllWords();updateView();}});buttonUpdate.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Word word = new Word("good","真棒");word.setId(20);wordDao.updatWords(word);updateView();}});buttonDelete.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Word word = new Word("", "");word.setId(20);wordDao.deleteWords(word);updateView();}});}void updateView(){List<Word> list = wordDao.getAllWords();String text = "";for(int i = 0; i < list.size(); i++){Word word = list.get(i);text += word.getId() + ":" + word.getWord() + ":" + word.getChineseMeaning() + "\n";}textView.setText(text);}
}

实现效果:

至于保存的数据库文件,可以在存储中找到,我们可以将数据库文件导出,然后利用一些工具例如 db Browser 来查看数据。

【Android-Room数据库系列】—— Room 基础相关推荐

  1. Android自定义控件开发系列(零)——基础原理篇

    在后边的文章中发现在说Android自定义时,有时候要重复解释很多东西,所以想想返回来增加一篇"基础原理篇",直接进入正题吧-- 首先的问题是:在Android项目开发中,什么时候 ...

  2. Android项目实战系列—基于博学谷(六)习题模块

    由于这个模块内容较多,篇幅较长,请耐心阅读. 习题模块分为两个部分 习题列表界面 习题详情界面 一.习题列表界面 1.习题界面 (1).创建习题界面 在res/layout文件夹中,新建一个布局文件, ...

  3. (android高仿系列)今日头条 --新闻阅读器 (三) 完结 、总结 篇

    从写第一篇今日头条高仿系列开始,到现在已经过去了1个多月了,其实大体都做好了,就是迟迟没有放出来,因为我觉得,做这个东西也是有个过程的,我想把这个模仿中一步一步学习的过程,按照自己的思路写下来,在根据 ...

  4. Android项目实战系列—基于博学谷(七)课程模块(上)

    由于这个模块内容较多,分为上.中.下 三篇博客分别来讲述,请耐心阅读. 课程模块分为四个部分 课程列表 课程详情 视频播放 播放记录 课程模块(上)主要讲述课程列表部分 一.水平滑动广告栏界面 1.创 ...

  5. Android调用WebService系列之对象构建传递

    上一篇我们讲了如何封装Android调用WebService的能力,把上一章的类加入我们便有了与WebService通讯的能力.往往我们会遇到WebService调用是通过对象来进行实际交互调用的.于 ...

  6. [Android Training视频系列]2.2 Pausing and Resuming an Activity

    [Android Training视频系列]2.2 Pausing and Resuming an Activity 1.主要内容 本讲介绍onPause和onResume,主要分析了在onPause ...

  7. 软件测试系列---软件测试基础

    软件测试系列--软件测试基础 1.什么是软件测试? **软件测试是一个过程,包含了若干活动,运行软件进行测试只是活动之一**进行软件测试可以人工方式也可以借助于工具**进行软件测试可以运行软件也可以不 ...

  8. Android NDK开发之 NEON基础介绍

    原文:http://blog.csdn.net/app_12062011/article/details/50434259 Android NDK开发之 NEON基础介绍 这是官方介绍: http:/ ...

  9. android中私有方法 继承,Android项目实战系列—基于博学谷(五)个人资料

    由于这个模块内容较多,篇幅较长,请耐心阅读. 个人资料模块分为两个部分 [x] [个人资料]() [x] [资料修改]() 一.个人资料 1.个人资料界面 (1).创建个人资料界面 在com.buxu ...

  10. Android Realm数据库

    In this tutorial, we'll be discussing the basics of Realm Database and implement it in our Android A ...

最新文章

  1. 利用外部知识增加QA答案自然程度,这是阿里的问答模型新思路丨EMNLP
  2. 常微分方程数值求解【python】
  3. python与或非位运算_python位运算
  4. 斯坦福大学机器学习第二课 “单变量线性回归”
  5. spring的基本用法
  6. 【发现问题】Java中PrintStream和PrintWriter的区别
  7. c语言int超出范围字符串,Go返回int64类型字段超出javascript Number范围的解决方法...
  8. 辽源天气预报软件测试,辽源天气预报15天
  9. Php获取id并提交表单,提交表单后 PHP获取提交内容的实现方法
  10. matlab elif,MATLAB与fftfilt相当于Python
  11. Redis的服务端启动和客户端连接
  12. mysql 查询姓王_MySQL查询语句练习题,测试足够用了
  13. 解决moss的log文件不断变大的办法
  14. java treeset 降序,Java TreeSet,Collections使用
  15. 模糊C均值聚类算法(原理+Matlab代码)
  16. python(3.6) django(1.11.1)问题积累
  17. Art of Problem Solving: Proof without Words
  18. 8年京东大数据架构师推荐的大数据开发学习路线
  19. 【C语言】小游戏系列——三子棋(保姆级教程)
  20. 如何在word2003中打开word2007格式的文件

热门文章

  1. 赚钱只要找到方法,就如吸空气
  2. 寻找点赞所需的URL
  3. 手机一般都由富士康等企业代工,是不是意味着各品牌质量都差不多?
  4. 详解 Solidity 事件Event
  5. html+css+javascript实现小游戏2048(详解,附源代码)
  6. partition 子句_SQL PARTITION BY子句概述
  7. azure vnc控制台_使用扩展和标签控制Azure成本
  8. java学习过程记录
  9. 通配符的匹配很全面, 但无法找到元素 'tx:annotation-driven' 的声明
  10. 【题解】CF#960 H-Santa's Gift