Android 架构组件 Room 介绍及使用
关于Room
Room是Google官方提供的数据库ORM框架,使用起来非常方便。Room在SQLite上提供了一个抽象层,以便在利用SQLite的全部功能的同时能更加流畅的访问数据库。
Room中三个主要组件:
Database:该组件用来创建一个database holder。注解定义实体的列表,类的内容定义从数据库中获取数据的对象(DAO)。它也是底层连接的主要入口。这个被注解的类是一个继承RoomDatabase的抽象类。在运行时,可以通过调用Room.databaseBuilder() 或者 Room.inMemoryDatabaseBuilder()来得到它的实例。
Entity:该组件的一个示例表示数据库的一行数据,对于每个Entity类来说,都会有对应的table被创建。想要这些Entity被创建,就需要卸载上面的Database的注解参属entities列表中,默认Entity中的所有字段都会来创建表,除非该字段上加上@Ignore注解。
Dao:该组件用来表述具有Data Access Object(DAO)功能的类或者接口,DAO类时Room的重要组件,负责定义查询(添加或者删除等)数据库的方法。使用@Database注解的类中必须定义一个不带参数的抽象方法,这个方法返回使用@Dao注解的类,返回类型为@Dao注解过的类的抽象方法Room会在编译时生成这个类的实现。
添加Room库的依赖
首先在Google的Maven存储库(项目最外层的build.gradle文件中添加如下:
allprojects { repositories { jcenter() google() }}
然后再app/build.gradle文件中添加相关依赖
dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') // Room依赖 implementation 'android.arch.persistence.room:runtime:1.0.0' annotationProcessor "android.arch.persistence.room:compiler:1.0.0" ......}
定义Entity
当一个类用 @Entity 注解并且被 @Database 注解中的 entities 属性所引用,Room就会在数据库中为这个被 @Entity 注解的类创建一张表。
PrimaryKey
每个Entity必须至少有一个主键(Primary Key),即使只有一个属性,也要使用@PrimaryKey来注释这个属性。如果想让Room为Entity设置自增ID,需要设置@PrimaryKey的autoGenerate属性。
ColumnInfo
如果想要自定义表中的字段时,需要在属性上面加上 @ColumnInfo 注解,如:@ColumnInfo(name = "ID"),"ID"为自定义字段名。
@Entity(tableName = "PHONE")public class PhoneBean implements Parcelable {
@PrimaryKey(autoGenerate = true) // 设置主键 @ColumnInfo(name = "ID") // 定义对应的数据库的字段名成 private int id;
@ColumnInfo(name = "PHONE") private String phone;
@ColumnInfo(name = "NAME") private String name;
@ColumnInfo(name = "DATE") private Date date;
public PhoneBean(String phone, String name, Date date) { this.phone = phone; this.name = name; this.date = date; }
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getPhone() { return phone; }
public void setPhone(String phone) { this.phone = phone; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Date getDate(){ return date; }
public void setDate(Date date) { this.date = date; }
@Override public int describeContents() { return 0; }
@Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.id); dest.writeString(this.phone); dest.writeString(this.name); dest.writeLong(this.date != null ? this.date.getTime() : -1); }
protected PhoneBean(Parcel in) { this.id = in.readInt(); this.phone = in.readString(); this.name = in.readString(); long tmpDate = in.readLong(); this.date = tmpDate == -1 ? null : new Date(tmpDate); }
public static final Parcelable.Creator<PhoneBean> CREATOR = new Parcelable.Creator<PhoneBean>() { @Override public PhoneBean createFromParcel(Parcel source) { return new PhoneBean(source); }
@Override public PhoneBean[] newArray(int size) { return new PhoneBean[size]; } };}
定义转换
TypeConverter
使用@TypeConverter注解定义转换的方法,如下,将Date类型的数据转换成Long类型来存储。
public class ConversionFactory {
@TypeConverter public static Long fromDateToLong(Date date) { return date == null ? null : date.getTime(); }
@TypeConverter public static Date fromLongToDate(Long value) { return value == null ? null : new Date(value); }}
如图,示例中将Date属性值转换为Long类型存储到数据库
Room创建的数据库表
读取到数据库的Date属性值,再将Date属性值转换为字符串显示
读取到的Date字段值
定义Dao
Dao组件定义一系列的增删改查操作。其中 Update 和 Detele 操作是根据定义的主键进行。
@Daopublic interface PhoneDao {
/** * 查询所有 * * @return */ @Query("SELECT * FROM PHONE") List<PhoneBean> getPhoneAll();
/** * 根据指定字段查询 * * @return */ @Query("SELECT * FROM PHONE WHERE phone = :phone") List<PhoneBean> loadPhoneByIds(String phone);
/** * 项数据库添加数据 * * @param phone */ @Insert(onConflict = OnConflictStrategy.REPLACE) void insertAll(List<PhoneBean> phone);
/** * 修改数据 * * @param phone */ @Update() void update(PhoneBean phone);
/** * 删除数据 * * @param phoneBean */ @Delete() void delete(PhoneBean phoneBean);}
创建数据库
@Database(entities = {PhoneBean.class}, version = 1, exportSchema = false)@TypeConverters({ConversionFactory.class})public abstract class PhoneDatabase extends RoomDatabase {
public static PhoneDatabase getDefault(Context context) { return buildDatabase(context); }
private static PhoneDatabase buildDatabase(Context context) { return Room.databaseBuilder(context.getApplicationContext(www.caibaoyule.cn ), PhoneDatabase.class, "PHONE.db") .allowMainThreadQueries() .build(); }
public abstract PhoneDao getPhoneDao();}
使用
增加
private void insertPhone(String mName, String mPhone) { List<PhoneBean> mPhones = new ArrayList<>(); mPhones.add(new PhoneBean(mPhone, mName)); PhoneDatabase.getDefault(getApplicationContext(www.douniu178.com)).getPhoneDao().insertAll(mPhones);}
查询
private void queryPhone(www.micheng178.com ) { List<PhoneBean> mPhoneLists = PhoneDatabase.getDefault(getApplicationContext()).getPhoneDao().getPhoneAll(); // 其他代码......}
修改
private void updatePhone(String name, String phone) { PhoneDatabase.getDefault(getActivity(www.255055.cn).getApplicationContext(www.huayi1.cn/ )).getPhoneDao().update(new PhoneBean(phone, name)); // ......}
删除
private void deletePhone(www.senta77.com) { PhoneDatabase.getDefault(getActivity(www.leyouzaixan.cn).getApplicationContext(www.yibaoyule1.com/)).getPhoneDao().delete(mPhoneBean); // ......}
查看案例源代码
https://github.com/mengjingbo/RoomSample
Android 架构组件 Room 介绍及使用的更多相关文章
- Android架构组件——ViewModel
概述 ViewModel,从字面上理解的话,它肯定是跟视图(View)以及数据(Model)相关的.正像它字面意思一样,它是负责准备和管理和UI组件(Fragment/Activity)相关的数据类, ...
- Android新组件RecyclerView介绍,其效率更好
今天我们首先来说为什么要介绍这个新组件RecyclerView,因为前几天我发布了一个常用面试题ListView的复用及如何优化的文章,介绍给一些开发者,但是我看到有关的反馈说:现在都不再用listv ...
- Android常用组件Broadcast介绍
一.Broadcast简介 Broadcast是Android的四大组件之一.可分为: 1.普通广播 发送一个广播,所有监听该广播的广播接收者都可以监听到改广播. 2.异步广播 当处理完之后的Inte ...
- Android 架构组件-Lifecycle、LiveData、ViewModel
Lifecycle Lifecycle组件包括LifecycleOwner.LifecleObserver,能方便监听Activity或者Fragment的生命周期. 步骤: 1.实现Lifecycl ...
- Android官方架构组件介绍之LifeCycle
Google 2017 I/O开发者大会于近日召开,在开发者大会上谷歌除了发布了Android O等一些新产品之外,也对Android代码的架构做出了一个官方的回应. Google 2017 I/O开 ...
- Android官方架构组件介绍之LifeCycle(一)
Android官方架构组件介绍之LifeCycle 下面是官方提供的Android App开发的架构图: 从上图可以看到一些关键字:ViewModel,LiveData,Room等.其实看了上面视频的 ...
- Android官方架构组件指南
此指南适用于那些曾经或现在进行Android应用的基础开发,并希望了解和学习编写Android程序的最佳实践和架构.通过学习来构建强大的生产级别的应用. 注意:此指南默认你对Android开发有比较深 ...
- Jetpack 架构组件 LiveData ViewModel MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Jetpack 架构组件 Lifecycle 生命周期 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- JS高级. 01 复习JS基础
1. JavaScript 包含: ____, ____, 和 ____. 2. JavaScript 的基本类型有 ____, ____, 和 ____. 3. JavaScript 的复合类型有 ...
- 事物总线模式实例——EventBus实例详解
事件总线模式是一种广泛运用于安卓开发之中的一种软件架构模式,而事件总线模式在安卓开发中最广泛的应用莫过于AndroidStudio提供的EventBus,所以我就EventBus来谈谈对事件总线模式的 ...
- 实验吧编程题python
网址:http://ctf5.shiyanbar.com/jia 之后第一步就是刷新一下网页,发现给的公式会变,(废话,要不直接算数不就行了...)但是格式不会变. 所以那就暴力一点好了,我们看一下这 ...
- sort()的部分用法
#include <iostream> #include <cstdio> #include <algorithm>//sort要包含的头文件 #include & ...
- spring boot打包问题
java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories ...
- python基础之try异常处理、socket套接字基础part1
异常处理 错误 程序里的错误一般分为两种: 1.语法错误,这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正 2.逻辑错误,人为造成的错误,如数据类型错误.调用方法错误等,这些解 ...
- vTaskDelete(NULL)使用注意事项
在实际开发过程中,记录犯过的一个错误,如下 vTaskDelete(NULL); iccid_return_num = ; 错误原因分析,在任务删除之后(调用vTaskDelete(NULL)之后), ...
- 字符串分割(C++)
一.用strtok函数进行字符串分割 原型: char *strtok(char *str, const char *delim); 功能:分解字符串为一组字符串. 参数说明:str为要分解的字符串, ...
- elasticsearch-mathc和term的区分
elasticsearch和mysql在思想上是有不同的,elasticsearch有分词一说,比如北京奥运分词成北京,奥运,北京奥运.分词要要考虑两点,一个是查询字符串要不要分词,还有就是原存储字段 ...
- Selenium驱动Chrome浏览器
import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome ...