原文链接

前言

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

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

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

Hello World

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

dependencies {
def room_version = "1.1.1" implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version" // use kapt for Kotlin // optional - RxJava support for Room
implementation "android.arch.persistence.room:rxjava2:$room_version" // optional - Guava support for Room, including Optional and ListenableFuture
implementation "android.arch.persistence.room:guava:$room_version" // Test helpers
testImplementation "android.arch.persistence.room:testing:$room_version"
}
复制代码

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

@Entity
public class User {
@PrimaryKey
private int uid; @ColumnInfo(name = "first_name")
private String firstName; @ColumnInfo(name = "last_name")
private String lastName; public int getUid() {
return uid;
} public void setUid(int uid) {
this.uid = uid;
} public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} @Override
public String toString() {
return "User{" +
"uid=" + uid +
", firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
'}';
}
}
复制代码

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


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

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

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

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

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

测试

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


for (int i = 0; i < 10; i++) {
User user = new User();
user.setUid(i);
user.setFirstName("Shell" + i);
user.setLastName("Hub" + i);
insertAll(db, user);
}
复制代码

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

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

查询所有数据

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

other...

Room单例模式

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


public class App extends Application {
private static Context context;
private static final String DATABASE_NAME = "SHELLHUB";
private static AppDatabase DB_INSTANCE;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext(); new Thread(new Runnable() {
@Override
public void run() {
DB_INSTANCE = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, DATABASE_NAME).build(); }
}).start();
} public static AppDatabase getDB() {
return DB_INSTANCE;
}
}
复制代码

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. MYSQL索引类型。MYSQLc储存引擎

                                                            MYSQL索引类型,MYSQLc储存引擎 MySQL索引创建与删除 MySQL存储引擎的 ...

  2. golang+docker 进入镜像测试本地通信

    首先进入docker镜像: docker-compose exec 镜像 sh //进入镜像 然后添加curl命令 apk add curl 最后在使用 curl  -d  localhost:809 ...

  3. 《深入理解 Java 虚拟机》笔记整理

    正文 一.Java 内存区域与内存溢出异常 1.运行时数据区域 程序计数器:当前线程所执行的字节码的行号指示器.线程私有. Java 虚拟机栈:Java 方法执行的内存模型.线程私有. 本地方法栈:N ...

  4. Mac Jenkins+fastlane 简单几步实现iOS自动化打包发布 + jenkins节点设置

    最近在使用jenkins 实现ios自动化打包发布蒲公英过程实践遇到了一些坑,特意记录下来方便有需要的人. 进入正题: 一.安装Jenkins 1.Mac上安装Jenkins 遇到到坑 因为 Jenk ...

  5. undefined 和 not defined

    概念上的解释: undefined是javascript语言中定义的五个原始类中的一个,换句话说,undefined并不是程序报错,而是程序允许的一个值. not defined是javascript ...

  6. stand up meeting 11/17/2015

    今日工作总结: 冯晓云:代表组内参加了北航软工M1检查,有幸在工作展开之前先观摩别人的工作,吸取经验和教训:现在看来,当时对往届ASE学员的采访还不够深入,只说统筹分工团结合作还是有些空,具体的任务划 ...

  7. 74HC595芯片的特性及使用方法和点评

    一 它能干什么?   74HC595是一个8位串行输入.平行输出的位移缓存器:平行输出为三态输出.在SCK的上升沿,单行数据由SDL输人到内部的8位位移缓存器,并由Q7‘输出,而平行输出则是在LCK的 ...

  8. Java - window下环境配置

    JDK下载 官网:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html 百度网盘: 链接:https://pan.ba ...

  9. Mybatis Generator通用Join的实现

    通常,我们使用Mybatis实现join表关联的时候,一般都是通过在xml或注解里写自定义sql实现. 本文通过Mybatis Generator的插件功能新增一个JoinPlugin插件,只要在配置 ...

  10. 一种特殊的生成器函数-Generator函数

    本节的内容,是建立在iterator遍历器知识的基础上.所以希望还没有看上一节的内容的话,最好还是看一看,当然你如果熟悉iterator就没有那个必要了. 既然你都看到这里来了,就咱们就接着往下讲.. ...