是时候该忘记Android SQLite了!Android官方ORM数据库Room技术解决方案简介(一)

Android的Romm是Android官方整合出来的一揽子ORM数据库解决方案。Android Room和历史上的ORM数据库如Android ORMLite(见附录文章1,2),Android greenDao等等,有诸多相同的设计思想和理念,但Android Room同时吸收众家ORM数据库之长,有自己新的创新和改进。我将分开写若干篇文章,逐点介绍Android官方的ORM数据库技术解决方案:Room。

(一)使用Android Room,首先要在gradle添加引用,我是基于room的version 1.0.0:

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

(二)和其他ORM数据库相似,Android Room需要先建立数据库表和Java对象的模型,User.java:

package zhangphil.demo;import android.arch.persistence.room.ColumnInfo;import android.arch.persistence.room.Entity;import android.arch.persistence.room.PrimaryKey;/** * Created by Phil on 2021年05月25日. */@Entity(tableName = "user_table")public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "userName") public String name; @ColumnInfo(name = "userAge") public int age; @ColumnInfo(name = "updateTime") public long updateTime;}

注解@Entity告诉Android Room,该User类将是一个数据库中的表。tableName如果开发者不自定义,那么Android系统默认将使用类名作为数据库中的表名。本例中的User,指定了表名为“user_table”,开发者可以根据自己情况自命名。

@PrimaryKey标注该字段是表中的主键,可根据该主键进行数据库的基本增删改查等等这些操作。当设置autoGenerate = true后,该主键将自增长。@ColumnInfo注解后面跟着的name,标明定义的Java变量将作为表中的一列。比如User中的

@ColumnInfo(name = "userName") public String name;那么数据库中表的一列userName中存储的数据就是name。

(三)构建针对User的Dao。UserDao.java:

package zhangphil.demo;import android.arch.persistence.room.Dao;import android.arch.persistence.room.Delete;import android.arch.persistence.room.Insert;import android.arch.persistence.room.OnConflictStrategy;import android.arch.persistence.room.Query;import android.arch.persistence.room.Update;import java.util.List;/** * Created by Phil on 2021年05月25日. */@Daopublic interface UserDao { /** * 查询 * * @return */ @Query("SELECT * FROM user_table") public List getAllUsers(); /** * 添加 * * @param users */ @Insert(onConflict = OnConflictStrategy.REPLACE) public void insertUser(User... users); /** * 更新 * * @param users */ @Update public void updateUser(User... users); /** * 删除 * * @param users */ @Delete public void deleteUser(User... users);}

@Dao注解标明该Java类是一个Android Room中的Dao对象。Android Room中的Dao,可以以接口interface形式定义。Android Room中的查询以SQL标准语句定义。比如在UserDao中的定义的:

/** * 查询 * * @return */ @Query("SELECT * FROM user_table") public List getAllUsers();该SQL语句将从我之前建立的数据块表“user_table”中,查询出所有的内容,然后返回一个集合。其他关于数据库的操作如增加(@Insert),删除(@Delete),修改(更新,@Update),均以注解标明。这些基本操作可以按照User中定义的@PrimaryKey主键操作。

(四)构造数据库。

这一步在Android Room技术中基本上是规范化的代码,写法比较规矩,建立UserDatabase.java:

package zhangphil.demo;import android.arch.persistence.room.Database;import android.arch.persistence.room.RoomDatabase;/** * Created by Phil on 2021年05月25日. */@Database(entities = {User.class}, version = 1)public abstract class UserDatabase extends RoomDatabase { public abstract UserDao getUserDao();}UserDatabase最重要的功能是提供给开发者各种Dao。开发者获得Dao后,就可以像操作基本Java对象实例一样操作Android Room数据中数据。

最终的代码结构如图:

(五)在MainActivity.java中测试我写的Android Room。注意涉及到数据库操作,要放到后台线程中运行。MainActivity.java:

package zhangphil.demo;import android.arch.persistence.room.Room;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import java.util.List;public class MainActivity extends AppCompatActivity { private String TAG = "输出"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new Thread(new Runnable() { @Override public void run() { databaseOperation(); } }).start(); } private void databaseOperation() { UserDatabase mUserDatabase = Room.databaseBuilder(getApplicationContext(), UserDatabase.class, "users").build(); UserDao mUserDao = mUserDatabase.getUserDao(); //写数据库 Log.d(TAG, "开始写入数据..."); writeDatabase(mUserDao, "张三", 18); writeDatabase(mUserDao, "李四", 19); Log.d(TAG, "写入数据库完毕."); //读数据库 Log.d(TAG, "第1次读数据库"); readDatabase(mUserDao); //更新数据库 updateUser(mUserDao); //读数据库 Log.d(TAG, "第2次读数据库"); readDatabase(mUserDao); //删除数据,根据主键id deleteUser(mUserDao, 1); //读数据库 Log.d(TAG, "第3次读数据库"); readDatabase(mUserDao); Log.d(TAG, "========================"); Log.d(TAG, "本轮数据库操作事务全部结束"); Log.d(TAG, "========================"); } private void readDatabase(UserDao dao) { Log.d(TAG, "读数据库..."); List users = dao.getAllUsers(); for (User u : users) { Log.d(TAG, u.id + "," + u.name + "," + u.age + "," + u.updateTime); } Log.d(TAG, "读数据库完毕."); } private void writeDatabase(UserDao dao, String name, int age) { User user = new User(); user.name = name; user.age = age; user.updateTime = System.currentTimeMillis(); dao.insertUser(user); } private void updateUser(UserDao dao) { Log.d(TAG, "更新数据库..."); User u = new User(); u.id = 2; u.name = "赵五"; u.age = 20; u.updateTime = System.currentTimeMillis(); dao.updateUser(u); Log.d(TAG, "更新数据库完毕."); } private void deleteUser(UserDao dao, int id) { Log.d(TAG, "删除数据库..."); User u = new User(); u.id = id; dao.deleteUser(u); Log.d(TAG, "删除数据库完毕."); }}

MainActivity.java实现基本的功能,在数据库中添加写入两条数据条目。然后在第一次读数据库操作中,从数据中读出来观察是否已经写进去。

接着更新数据库,根据User的PrimaryKey主键id更新,我把数据库中主键id为2的数据行更新。再次第2次读数据库,验证我的更新操作是否成功。

然后再根据主键删除id=1的数据库数据行,第3次读数据库,验证数据库删除的操作。代码运行后的logcat输出:

2021年05月25日 10:49:22.631 1962021年05月25日641/zhangphil.demo D/输出: 开始写入数据...2021年05月25日 10:49:22.688 1962021年05月25日641/zhangphil.demo D/输出: 写入数据库完毕.2021年05月25日 10:49:22.688 1962021年05月25日641/zhangphil.demo D/输出: 第1次读数据库2021年05月25日 10:49:22.688 1962021年05月25日641/zhangphil.demo D/输出: 读数据库...2021年05月25日 10:49:22.689 1962021年05月25日641/zhangphil.demo D/输出: 1,张三,18,15114053626312021年05月25日 10:49:22.689 1962021年05月25日641/zhangphil.demo D/输出: 2,李四,19,15114053626742021年05月25日 10:49:22.689 1962021年05月25日641/zhangphil.demo D/输出: 读数据库完毕.2021年05月25日 10:49:22.689 1962021年05月25日641/zhangphil.demo D/输出: 更新数据库...2021年05月25日 10:49:22.692 1962021年05月25日641/zhangphil.demo D/输出: 更新数据库完毕.2021年05月25日 10:49:22.692 1962021年05月25日641/zhangphil.demo D/输出: 第2次读数据库2021年05月25日 10:49:22.692 1962021年05月25日641/zhangphil.demo D/输出: 读数据库...2021年05月25日 10:49:22.693 1962021年05月25日641/zhangphil.demo D/输出: 1,张三,18,15114053626312021年05月25日 10:49:22.693 1962021年05月25日641/zhangphil.demo D/输出: 2,赵五,20,15114053626892021年05月25日 10:49:22.693 1962021年05月25日641/zhangphil.demo D/输出: 读数据库完毕.2021年05月25日 10:49:22.693 1962021年05月25日641/zhangphil.demo D/输出: 删除数据库...2021年05月25日 10:49:22.696 1962021年05月25日641/zhangphil.demo D/输出: 删除数据库完毕.2021年05月25日 10:49:22.696 1962021年05月25日641/zhangphil.demo D/输出: 第3次读数据库2021年05月25日 10:49:22.696 1962021年05月25日641/zhangphil.demo D/输出: 读数据库...2021年05月25日 10:49:22.698 1962021年05月25日641/zhangphil.demo D/输出: 2,赵五,20,15114053626892021年05月25日 10:49:22.698 1962021年05月25日641/zhangphil.demo D/输出: 读数据库完毕.2021年05月25日 10:49:22.698 1962021年05月25日641/zhangphil.demo D/输出: ========================2021年05月25日 10:49:22.698 1962021年05月25日641/zhangphil.demo D/输出: 本轮数据库操作事务全部结束2021年05月25日 10:49:22.699 1962021年05月25日641/zhangphil.demo D/输出: ========================

附录:

1,《Android ORMLite数据库简介》链接:http://blog.csdn.net/zhangphil/article/details/46878075

2,《Android ORMLite ForeignCollection关联外部集合》链接:http://blog.csdn.net/zhangphil/article/details/46891021

android room 分页,Android官方ORM数据库Room技术解决方案简介(一)相关推荐

  1. android studio 分页,Android Paging codelab

    1.介绍 你要建造什么 在这个代码库中,您从一个示例应用程序开始,该应用程序已经显示了GitHub存储库列表,从数据库加载数据并且由网络数据支持. 只要用户滚动并到达显示列表的末尾,就会触发新的网络请 ...

  2. android okgo分页,Android热门网络框架OkGo详解

    OkGo简介 该库是封装了okhttp的网络框架,可以与RxJava完美结合,比retrofit更简单易用.支持大文件上传下载,上传进度回调,下载进度回调,表单上传(多文件和多参数一起上传),链式调用 ...

  3. Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据

    Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据 我之前写了一系列关于AsyncListUtil实现RecyclerView和ListView的分页 ...

  4. Android开源库--ActiveAndroid(active record模式的ORM数据库框架)

    Github地址:https://github.com/pardom/ActiveAndroid 前言 我一般在Android开发中,几乎用不到SQLlite,因为一些小数据就直接使用Preferen ...

  5. Android高性能ORM数据库DBFlow入门

    DBFlow,综合了 ActiveAndroid, Schematic, Ollie,Sprinkles 等库的优点.同时不是基于反射,所以性能也是非常高,效率紧跟greenDAO其后.基于注解,使用 ...

  6. android listview分页显示,Android应用中使用ListView来分页显示刷新的内容

    点击按钮刷新1.效果如下: 实例如下:  上图的添加数据按钮可以换成一个进度条  因为没有数据所以我加了一个按钮添加到数据库用于测试:一般在服务器拉去数据需要一定的时间,所以可以弄个进度条来提示用户: ...

  7. 在Android中查看和管理sqlite数据库

    在Android中查看和管理sqlite数据库 在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看.android项目中的sqlite数据库 ...

  8. android listview 分页

    最近做了下listview的分页,跟WEB上的分页是一个意思,需要那几个分页参数,不同的是sqlite中分页的查询语句,简便的方法需要用Limit,Offset 关键字,前者是查询每页展示的记录数,后 ...

  9. Android xUtils3源码解析之数据库模块

    本文已授权微信公众号<非著名程序员>原创首发,转载请务必注明出处. xUtils3源码解析系列 一. Android xUtils3源码解析之网络模块 二. Android xUtils3 ...

  10. 在 Android 应用程序中使用 SQLite 数据库以及怎么用

    part one : android SQLite 简单介绍 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库.它支持 SQL 语言,而且仅仅利用非常少的内存就有非常好的性能.此外它还是开 ...

最新文章

  1. 博客 | Machine Learning Yearning 要点笔记
  2. c语言写程序计算表达式的值,C语言 写的 表达式求值。
  3. 我的世界无人维护的服务器,我的世界:如何进入9年无人管理的2B2T?全球最大战争服务器!...
  4. Docker运行参数详解
  5. python字符串用空格切片_Python切片操作去除字符串首尾的空格
  6. 送书 | Halcon机器视觉算法原理与编程实战
  7. 计算机输出科学计数法,python不用科学计数法
  8. 数字基带调制解调matlab仿真,我的基于MATLAB仿真的数字调制与解调设计
  9. gsp计算机设施设备表格,GSP计算机系统内审表
  10. mathcad prime server system(PASS云计算书系统)开发
  11. STM32驱动AD9833
  12. 扩增子分析流程 —— 数据处理(vsearch)
  13. Anaconda修改国内镜像源
  14. Linux-网络命令
  15. 应用计算机解数学模型之我见,初中数学建模教学之我见
  16. python中for循环的代码_Python中的九九乘法表(for循环)
  17. 服务细分--服务电商的发展趋势与未来!
  18. linemod算法小结
  19. HTML5期末大作业:商城网站设计——仿天猫在线商城(HTML和CSS实现天猫在线商城网站)
  20. 华为路由器常用命令集合

热门文章

  1. matlab 将矩阵变为一列,MATLAB中把一个矩阵转换为一列
  2. ubuntu14上nvidia 1080和 titan xp 驱动安装踩的坑
  3. 2019-04-26周五宁波和杭州都下雨了,晚饭的鱼粉好大份哦,这是我第一次吃鱼粉!Hhhhhhhh下雨了就给吃点面才暖和,辛苦快递小哥哥了呀,其实这家店就在食堂我看见很多次了懒得买,外卖好像更便宜!
  4. CSS模块、筛选模块、文档处理(CUD)模块、事件模块
  5. 哄女朋友的睡前小故事(一)
  6. window7中出现 你需要权限来执行此操作 的解决方法
  7. BZOJ1750: [Usaco2005 qua]Apple Catching
  8. grpc-go源码剖析七十四之什么情况下服务器端通知客户端,双方关闭链接?(goAway帧处理逻辑)
  9. Unity shader系列:好用的IDE--JetBrain Rider
  10. sql查询重复订单号