详细介绍Android-Room数据库的使用

前言

Google终于发布了一个和SQLite相关的库了。之前一直都是在SQLite、XUtils、greenDao、Realm这些数据库之间来回折腾。现在终于有一个更“正统”数据库了。

Room是什么?

Room是一个持久性数据库。

Room持久性库提供了SQLite的抽象层,以便在充分利用SQLite的同时允许流畅的数据库访问。

为什么会选择Room?

前面我也说到了现在也有不少开源的数据库给大家使用,那为什么我们还要去学习使用这个库呢?当然不是我前面说的“正不正统”的原因了。

因为Room有下面几个优点:

① SQL查询在编译时就会验证 - 在编译时检查每个@Query和@Entity等,这就意味着没有任何运行时错误的风险可能会导致应用程序崩溃(并且它不仅检查语法问题,还会检查是否有该表)

② 较少的模板代码

③ 与 LiveData 集成

该如何使用它?

1、在app/build.gradle中添加以下依赖

implementation 'android.arch.persistence.room:runtime:1.0.0'
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'

你可以点击这里查看最新依赖版本号

2、创建JavaBean

@Entity
public class User {

 @PrimaryKey(autoGenerate = true)//主键是否自动增长,默认为false
 private int id;
 private String name;
 private int age;

 public int getId() {
 return id;
 }

 public void setId(int id) {
 this.id = id;
 }

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

 public int getAge() {
 return age;
 }

 public void setAge(int age) {
 this.age = age;
 }
 //这里的getter/setter方法是必须的
 //这里的getter/setter方法是必须的
 //这里的getter/setter方法是必须的
 //重要的事说三遍
}

这里需要使用 @Entity 来注解该类

至少要有一个主键 @PrimaryKey

3、创建Dao

接下来,需要为我们的实体创建DAO。 DAO代表数据访问对象,所以它是告诉我们的数据库如何操作数据的一种方式:

@Dao
public interface UserDao {
 @Query("SELECT * FROM user")
 List<User> getAllUsers();

 @Insert
 void insert(User... users);

 @Update
 void update(User... users);

 @Delete
 void delete(User... users);
}

使用 @Dao 注解该接口

@Insert , @Update , @Delete , @Query 代表我们常用的 插入 、 更新 、 删除 、 查询 数据库操作

@Insert , @Update , @Delete 可以传入多种不同的参数。例如:

@Insert
void insert(User... users);

@Insert
void insert(User user);

@Insert
void insert(List<User> userLists);

同理, @Query 也可以返回多种不同的类型。

@Query("SELECT * FROM user")
List<User> getAllUsers();

@Query("SELECT * FROM user WHERE id=:id")
User getUser(int id);

@Query("SELECT * FROM user")
Cursor getUserCursor();

当然,除了这些我们还可以传入一些限制符进去。例如,

@Query("SELECT * FROM user WHERE age=:age")
List<User> getUsersByAge(int age);

@Query("SELECT * FROM user WHERE age=:age LIMIT :max")
List<User> getUsersByAge(int max, int... age);

4、创建数据库

@Database(entities = { User.class }, version = 1,exportSchema = false)
public abstract class UserDatabase extends RoomDatabase {

 private static final String DB_NAME = "UserDatabase.db";
 private static volatile UserDatabase instance;

 static synchronized UserDatabase getInstance(Context context) {
 if (instance == null) {
  instance = create(context);
 }
 return instance;
 }

 private static UserDatabase create(final Context context) {
 return Room.databaseBuilder(
  context,
  UserDatabase.class,
  DB_NAME).build();
 }

 public abstract UserDao getUserDao();
}

这里使用 @Database 注解该类并添加了 表名 、 数据库版本 (每当我们改变数据库中的内容时它都会增加),所以这里使用 exportSchema = false

注意:除了添加表映射的类以及和数据库版本外,还要添加 exportSchema = false 否则会报警告。

Error:(10, 17) 警告: Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide room.schemaLocation annotation processor argument OR set exportSchema to false.

我们抽象了 getUserDao() 方法,这是必要的。

5、使用数据库

我们终于能够操作我们的数据库了。但是所有的操作必须在后台线程中完成。你可以通过使用 AsyncTask , Thread , Handler , RxJava 或其它方式来完成。

如果没有在后台线程执行,并且也没有说明可以在主线程操作的话,就会报以下错误。

Caused by: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

例如,我们可以像下面这样插入数据

User user=new User();
user.setName("name1");
user.setAge(18);
UserDatabase
 .getInstance(context)
 .getUserDao()
 .insert(user);

或者这样

List<User> allUsers = UserDatabase
 .getInstance(RoomActivity.this)
 .getUserDao()
 .getAllUsers();

好了,基本的使用的方式就这些了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android Room数据库多表查询的使用实例
(0)

相关推荐

  • Android Room数据库多表查询的使用实例

    Android-Room数据库(介绍) 前言 在SQLite数据库中,我们可以指定对象之间的关系,因此我们可以将一个或多个对象与一个或多个其他对象绑定.这就是所谓的一对多和多对多的关系. 既然要多表查询,所以表之间就得有关联.这时候我们就得使用新的注解符@ForeignKey 接下来的内容,就需要上节的内容了 @Entity public class Company { @PrimaryKey(autoGenerate = true) private int id; private String

  • 详细介绍Android中的视图焦点Focus的使用

    在非触摸屏设备中接收事件和处理响应的控件是具有焦点(Focused)的控件.一个窗口中一个时间内只能有一个具有焦点的控件.在早期具有滚轮设备的android系统中以及现在的智能TV电视应用中视图的焦点控制就非常重要了.而在触摸设备上通常默认情况下只有EditText控件才具有焦点,而我们通常会遇到的一个问题就是当进入一个具有EditText的界面时键盘就会自动弹出,而且有时候可能无法消失,但需求可能是进入时不弹出键盘.而这些所有的东西都是和视图的焦点有关,因此本文的重点就是介绍视图的焦点属性和方

  • 详细介绍Android中回调函数机制

    提示:在阅读本文章之前,请确保您对Touch事件的分发机制有一定的了解 在Android的学习过程中经常会听到或者见到"回调"这个词,那么什么是回调呢?所谓的回调函数就是:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体的实现,需要B类去实现,B类实现该方法后,它本身不会去调用该方法,而是传递给A类,供A类去调用,这种机制就称为回调. 下面我们拿具体的Button的点击事件进行模拟分析: 首先,在View类中我们能找到setOnClickLis

  • Android onCreate( )方法详细介绍

    onCreate( )方法是android应用程序中最常见的方法之一,那么,我们在使用onCreate()方法的时候应该注意哪些问题呢? 先看看Google Android Developers官网上的解释: onCreate(Bundle) is where you initialize your activity. Most importantly, here you will usually call setContentView(int) with a layout resource d

  • Android内置SQLite的使用详细介绍

    目录 一.创建数据库 1.新建数据库帮助类 2.在数据库帮助类中输入代码 3.代码讲解 二.添加数据 1.界面效果 2.准备工作 3.布局界面 activity_main.xml 4.类文件代码 MainActivity.java 5.代码讲解 三.查询数据 1.界面效果图 2.布局界面 activity_second.xml 3.类文件 SecondActivity.java 4.代码讲解 四.修改数据 1.界面效果图 2.布局界面 activity_ third.xml 3.类文件 Thir

  • oracle 虚拟专用数据库详细介绍

    所谓虚拟专用数据库(VPD)指的是,通过在数据库里进行配置,从而让不同的用户只能查看某个表里的部分数据.VPD分为以下两个级别. 行级别:在该级别下,可以控制某些用户只能查看到某些数据行.比如,对于销售数据表sales 来说,每个销售人员只能检索出他自己的销售数据,不能查询其他销售人员的销售数据. 列级别:在该级别下,可以控制某些用户不能检索某个表的某个列的值.比如用户HR 下的 employees 表中,含有工资(salary)列,由于该列比较敏感,因此不让其他用户查询该列的值. 其他用户检索

  • Openstack 使用migrate进行数据库升级实现方案详细介绍

    Openstack 使用migrate进行数据库升级实现方案详细介绍 OpenStack中随着版本的切换,新版本加入一些数据库表或者增加字段等是必然的事情,如何比较容易的进行这些数据库升级的适配和管理,这里就要用到oslo_db中的migrate了,这里以为M版本的heat为例,讲解一下migrate管理db的原理. 我们使用migrate需要用到的主要包含以下两部分:1.versions里面的为版本号+数据库适配脚本:2.migrate.cfg为migrate需要用到的配置文件,两部分的命名是

  • Android手机信号强度检测详细介绍

    最近到处在跑着找工作,难免在面试过程中遇到这样那样的问题,记得最清楚一次在面试过程中被问到,当手机处于弱网状态下,如何处理,如何监听网络信号强度变化.但是真是蒙了,回答的乱七八糟,思路一点都不明确.今天小编在这里带领大家了解下关于手机信号强度的相关几个概念. Android手机信号强度介绍 android定义了2种信号单位:dBm和asu.它们之间的关系是:dBm =-113+2asu,这是google给android手机定义的特有信号单位.例如,我的信号强度为-53dBm,则对应30asu,因

  • Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍

    Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍 最近在学校搞点东西,搞了2天的webservice,心累呀,今天中午和小伙伴终于弄通了,感觉就是一些细节问题没有注意到,啊,我的时间呀,进这么过去了,为了不让小伙伴们走弯路,我还是认真的把开发文档写一遍吧! 首先,如果我们要用CXF发布webservice用自定义类型的对象来当参数传递的话,我们应该先把这个类序列化一遍,下面就是我测试的代码,我创建了一个TGrade类,实现了KvmSerializable接

  • Android中imageview.ScaleType使用方法详细介绍

    Android中imageview.ScaleType使用方法详细介绍 ScaleType属性用以表示显示图片的方式,共有8种取值: ScaleType.CENTER:图片大小为原始大小,如果图片大小大于ImageView控件,则截取图片中间部分,若小于,则直接将图片居中显示. ScaleType.CENTER_CROP:将图片等比例缩放,让图像的短边与ImageView的边长度相同,即不能留有空白,缩放后截取中间部分进行显示. ScaleType.CENTER_INSIDE:将图片大小大于Im

  • SQL Server 数据库的备份详细介绍及注意事项

    SQL Server 备份 前言 为什么要备份?理由很简单--为了还原/恢复.当然,如果不备份,还可以通过磁盘恢复来找回丢失的文件,不过SQL Server很生气,后果很严重.到时候你就知道为什么先叫你备份一次再开始看文章了.∩__∩.本系列将介绍SQL Server所有可用的备份还原功能,并尽可能用实例说话. 什么是备份?SQL Server基于Windows,以文件形式存放资料,所以备份就是Windows上SQL Server相关文件的一个某个时间点的副本.根据备份类型的不同,副本的种类和内

随机推荐