原文链接

前言

Android中提供了SQLite数据库进行数据的持久化 ,并提供了对应API访问数据库,而Room框架提供了SQLite数据访问抽象层,为高效的数据库访问层带来便捷

APP可以缓存用户数据,当APP离线时便从SQLite读取数据,当重新连线时即可完成和服务器数据的同步

谷歌官方强烈推荐使用Room框架操作SQLite数据库

Hello World

首先在build.gradle中添加必要依赖

  1. dependencies {
  2. def room_version = "1.1.1"
  3. implementation "android.arch.persistence.room:runtime:$room_version"
  4. annotationProcessor "android.arch.persistence.room:compiler:$room_version" // use kapt for Kotlin
  5. // optional - RxJava support for Room
  6. implementation "android.arch.persistence.room:rxjava2:$room_version"
  7. // optional - Guava support for Room, including Optional and ListenableFuture
  8. implementation "android.arch.persistence.room:guava:$room_version"
  9. // Test helpers
  10. testImplementation "android.arch.persistence.room:testing:$room_version"
  11. }
  12. 复制代码

创建实体类User,@Entity表示该类对应数据库中的表,@ColumnInfo后面的name属性对应数据库中的字段名,并实现该实体类的GetterSetter方法

  1. @Entity
  2. public class User {
  3. @PrimaryKey
  4. private int uid;
  5. @ColumnInfo(name = "first_name")
  6. private String firstName;
  7. @ColumnInfo(name = "last_name")
  8. private String lastName;
  9. public int getUid() {
  10. return uid;
  11. }
  12. public void setUid(int uid) {
  13. this.uid = uid;
  14. }
  15. public String getFirstName() {
  16. return firstName;
  17. }
  18. public void setFirstName(String firstName) {
  19. this.firstName = firstName;
  20. }
  21. public String getLastName() {
  22. return lastName;
  23. }
  24. public void setLastName(String lastName) {
  25. this.lastName = lastName;
  26. }
  27. @Override
  28. public String toString() {
  29. return "User{" +
  30. "uid=" + uid +
  31. ", firstName='" + firstName + '\'' +
  32. ", lastName='" + lastName + '\'' +
  33. '}';
  34. }
  35. }
  36. 复制代码

创建实体类对应的daoUserDao,完成User的增删改查(CRUD)接口定义,@Dao注解定义一个dao层,参数赋值(传递)使用:clumn_name进行赋值


  1. @Dao
  2. public interface UserDao {
  3. @Query("SELECT * FROM user")
  4. List<User> getAll();
  5. @Query("SELECT * FROM user WHERE uid IN (:userIds)")
  6. List<User> loadAllByIds(int[] userIds);
  7. @Query("SELECT * FROM user WHERE first_name LIKE :first AND "
  8. + "last_name LIKE :last LIMIT 1")
  9. User findByName(String first, String last);
  10. @Insert(onConflict = OnConflictStrategy.REPLACE)
  11. void insertAll(User... users);
  12. @Delete
  13. void delete(User user);
  14. }
  15. 复制代码

创建AppDatabase@Database注解表示这是一个数据库操作类,entities对应Entity实体类,version用于数据库版本升级,并在该抽象类中定义一个返回dao层的抽象方法

  1. @Database(entities = {User.class}, version = 1, exportSchema = false)
  2. public abstract class AppDatabase extends RoomDatabase {
  3. public abstract UserDao userDao();
  4. }
  5. 复制代码

初始化用于操作数据库的实例对象AppDatabase,需要注意的是不能在主线程中初始化,必须新开启一个线程进行初始化,否则会报错,或者无法创建数据库

  1. new Thread(new Runnable() {
  2. @Override
  3. public void run() {
  4. AppDatabase db = Room.databaseBuilder(getApplicationContext(),
  5. AppDatabase.class, "database-name").build();
  6. }
  7. }).start();
  8. 复制代码

测试

增加,也可以传一个User数组


  1. for (int i = 0; i < 10; i++) {
  2. User user = new User();
  3. user.setUid(i);
  4. user.setFirstName("Shell" + i);
  5. user.setLastName("Hub" + i);
  6. insertAll(db, user);
  7. }
  8. 复制代码

如果报以下错误,修改dao层的注解为@Insert(onConflict = OnConflictStrategy.REPLACE)

  1. android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: User.uid (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY)
  2. 复制代码

查询所有数据

  1. for (User user : db.userDao().getAll()) {
  2. System.out.println(user);
  3. }
  4. 复制代码

other...

Room单例模式

最好使用设计模式中的单例模式获取数据库实例,因为每次获取数据库实例都很耗时并且耗内存,我们可以自定义一个类继承Application并定义一个public static方法获取数据库实例


  1. public class App extends Application {
  2. private static Context context;
  3. private static final String DATABASE_NAME = "SHELLHUB";
  4. private static AppDatabase DB_INSTANCE;
  5. @Override
  6. public void onCreate() {
  7. super.onCreate();
  8. context = getApplicationContext();
  9. new Thread(new Runnable() {
  10. @Override
  11. public void run() {
  12. DB_INSTANCE = Room.databaseBuilder(getApplicationContext(),
  13. AppDatabase.class, DATABASE_NAME).build();
  14. }
  15. }).start();
  16. }
  17. public static AppDatabase getDB() {
  18. return DB_INSTANCE;
  19. }
  20. }
  21. 复制代码

Android Room SQLite持久层框架的更多相关文章

  1. 持久层框架之MyBatis

    1.mybatis框架介绍: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...

  2. MyBatis持久层框架使用总结

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2 ...

  3. java持久层框架mybatis如何防止sql注入

    看到一篇很好的文章:http://www.jfox.info/ava-persistence-framework-mybatis-how-to-prevent-sql-injection sql注入大 ...

  4. .NET平台下,关于数据持久层框架

    在.NET平台下,关于数据持久层框架非常多,本文主要对如下几种做简要的介绍并推荐一些学习的资源: 1.NHibernate 2.NBear 3.Castle ActiveRecord 4.iBATIS ...

  5. 菜鸟学习Hibernate——持久层框架

    一.Java操作数据库的阶段. Java对数据库进行操作经历了三个阶段. 1.1操作JDBC阶段 这个阶段就是利用JDBC类来操作数据库.这个阶段出现了两个问题: 代码过度重复:在每一次数据库操作的是 ...

  6. .NET平台数据持久层框架

    在.NET平台下的几个数据持久层框架: 1.NHibernate 2.NBear 3.Castle ActiveRecord 4.iBATIS.NET 5.DAAB 6.DLinq

  7. Hibernate数据库持久层框架

    Hibernate是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hib ...

  8. spring-boot+mybatis开发实战:如何在spring-boot中使用myabtis持久层框架

    前言: 本项目基于maven构建,使用mybatis-spring-boot作为spring-boot项目的持久层框架 spring-boot中使用mybatis持久层框架与原spring项目使用方式 ...

  9. Java数据持久层框架 MyBatis之背景知识三

    摘录自:http://www.cnblogs.com/lcngu/p/5437281.html 对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.or ...

随机推荐

  1. 【php】文件系统

    一. 了解文件: a) 我们在Windows当中已知众多种文件类型:png.jpeg.jpg.gif.mp3.mp4.avi.rmvb.txt.doc.exl.ppt.php.exe b) 无论我们w ...

  2. Java第五天,API常用类,静态(static)、集合(ArrayList)、日期(Date)、日历(Calendar)的使用方法

    上文中我们学习到了Random随机数类和ArrayList<E>集合.这两个知识点都是经常用到的,那么除了这两个外,还有哪些知识点是我们所必须掌握的呢? static 使用static需要 ...

  3. 汇编刷题:求1000H单元开始的10个无符号字节数的最大值(本题放入了BL寄存器)

    DATA SEGMENT ORG 1000H INFO DB 1,2,3,4,5,70H,71H,72H,80H,92H MAX DB 00H DATA ENDS CODE SEGMENT ASSUM ...

  4. NHibernate COUNT(*) 统计问题

    NHibernate这个框架用了有一年多了,相对有很大的优势,可以省去很多写Sql的时间. 但是如果你想用它做统计,那么有点抱歉,只能手动写写了.它内置的东西很难符合你的需求. 我遇到的问题是这样的. ...

  5. VMware 15.5虚拟机安装群晖NAS

     一.群晖nas简介 NAS(Network Attached Storage:网络附属存储),按字面意思理解其实就是网络存储器,可以理解为存储资料的网盘,云盘.NAS本身支持多种协议(如NFS.CI ...

  6. tf.nn.conv2d 卷积

    tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None) 第一个参数input:指需要做卷积的输入 ...

  7. CentOS 配置OOM监控报警

    由于程序设计不合理或者瞬间高并发访问时,很有可能会触发OOM(Out of memory),这里指的是操作系统级别的OOM.具体什么是OOM,以及怎样发生这里不在赘述,因为笔者认为这是IT从业工作者的 ...

  8. Centos 开启网络

    在VMWare上安装了Centos 7,但是发现网络无法连接. # ping www.baidu.com 确认网络无法连接 # ifconfig 查看centos7中的网络配置属性. 启动网络,开启e ...

  9. 给想学python但还没有接触过的你,python代码的书写规则,小白入门

    Python 文件结构 变量命名 注释 单行注释 多行注释 缩进 Python 文件结构 #!/usr/bin/env python3 # 指定python解释器 # -*- coding: utf- ...

  10. 对短路变形POJ3615

    Farmer John wants the cows to prepare for the county jumping competition, so Bessie and the gang are ...