最近在浏览某篇有关事件流的文章时,里面提到了数据的流处理,兴趣来了,就想看看能否在Android端实现一个。

根据文章的介绍,将每次数据的变更事件,像是插入,删除或者更新等,记为一个不可变的事件,让数据在事件中流淌,而不是对数据库进行破坏性的写入,也就是说,直接读取数据的聚合结果就能获取最好的性能。

事件流可以完成下面的工作:

1.获取所有的原始事件,可能需要进行转换,然后将它们加载到一个大型的数据仓库中供分析人员使用;

2.更新全文搜索索引,使用户可以搜索最新的数据;
3.更新缓存,使系统可以从快速缓存中读取数据,并保证缓存中的数据是最新的;
4.通过对事件流进行处理创建一个新的事件流,然后将后者作为另一个系统的输入。
    可能带来的好处如下:
1.松耦合:数据读写使用不同的数据库模式,读取的数据经由写入的数据转换而来,应用程序不同部分间的耦合度降低了;
2.读写性能:规范化(写入快)和非规范化(读取快)的争论源于数据读写使用同一个模式的假设,如果数据读写使用不同的数据库模式,读写速度都会得到提升;
3.扩展性:因为事件流是一种简单的抽象,而且允许开发人员将应用程序分解成流的生产者和消费者,所以容易跨机器并行和扩展;
4.灵活性:原始事件简单明确,模式迁移不会造成多大影响,而向用户展示数据要复杂得多,但如果有一个转换过程可以实现从原始事件到缓存内容的转换,那么当需要新的用户界面时,只需要使用新的逻辑构建新的缓存;
5.错误场景:原始事件是不变的事实,如果系统出现问题,那么开发人员总是可以用相同的顺序将事件重放。
 
   如果是这样的设计, 编写查询或者规则来匹配满足特定模式的事件,还要在流上进行全文搜索,在流上事先注册一个查询,当有事件匹配查询时发送通知。
由此衍生出几个概念:
1.响应式:主要是将事件流提供给用户界面使用;
2.变更数据捕获:按照我们熟悉的方式使用数据库,但要将任何插入,更新和删除操作抽取到一个数据变更事件流中。
  初步的实现已经出来了,大概的实现如下:
 
1.创建数据库和表
      在assets文件夹下创建database.xml文件,里面配置数据库的名字,版本号和数据库的表:
   <?xml version="1.0" encoding="utf-8"?>
<database>
<!-- 数据库名称 -->
<dbname value="zwb.db"></dbname> <!-- 数据库版本 -->
<version value="1"></version> <!-- 数据库表 -->
<list>
<mapping class="com.zwb.args.dbpratice.model.Status"></mapping>
<mapping class="com.zwb.args.dbpratice.model.User"></mapping>
</list>
</database>

然后初始化DatabaseCache:

DatabaseCache cache = DatabaseCache.getInstance(this);

该操作应该是在Application中声明,因为该动作涉及到数据库和表的创建。

2.基本使用

声明一个model类,继承自BaseTable:

             @Table(table = "status")
public class Status extends BaseTable {
@Column
private String name;
@Column
private String statusId; public void setName(String name) {
this.name = name;
} public String getName() {
return name;
} public void setStatusId(String id) {
this.statusId = id;
} public String getStatusId() {
return statusId;
}
}

其中,@Table声明的是该model对应的表的名字,@Column声明的是该字段对应的数据库中的类型。如果该字段的类型和数据库中的类型不一致,可以通过@ColumnType来指定类型。

3.数据插入

 Status status = new Status();
status.setName("转发");
status.setStatusId("01");
InsertEvent insertStatusEvent = new InsertEvent();
insertStatusEvent.to(Status.class).insert(status);

4.数据更新

 UpdateEvent updateEvent = new UpdateEvent();
updateEvent.to(Status.class).where("id", "01").update("name", "你好");

5.数据查询

List<Status> statusList = cache.from(Status.class).where("statusId", "01").find();
这样就是查询Status表中的statusId为01的所有记录。当然,也可以查询所有数据:
List<Status> statusList = cache.from(Status.class).findAll();

6.数据读取

DatabaseCache cache = DatabaseCache.getInstance(this);
List<Status> statusList = cache.readFromDb(Status.class);

该操作应该在Application中执行,然后执行相应的数据插入:

 for(Status status : statusList){
InsertEvent insertEvent = new InsertEvent();
insertEvent.to(Status.class).insert(status);
}
 这样数据就会从数据库转移到事件流中。

7.数据存储
DatabaseCache cache = DatabaseCache.getInstance(this);
cache.insertToDb(Status.class);
 这样就会将和Status有关的数据插入到数据库中。

8.数据删除
DeleteEvent deleteEvent = new DeleteEvent();
deleteEvent.to(Status.class).where("id", "01").delete();
  这样就是删除id为01的数据。

  如果是删除某个集合的全部数据,则是:
        List<Status> statuses = new ArrayList<Status>();
for(int i = 0; i < 10; i++){
Status status = new Status();
status.setName("你好");
status.setId("01");
statuses.add(status);
}
deleteEvent.to(Status.class).deleteAll(statuses);
  如果是删除表的全部数据:
deleteEvent.to(Status.class).deleteAll();

这是目前的实现,后面会有时间讲解一下实现的过程,具体的项目地址放在github上:https://github.com/wenjiang/EventStreamDB,有兴趣可以上去看看,顺便给个星星。


 

 


 


 

 

 

 

 

 

 

Android上的事件流操作数据库的更多相关文章

  1. Android—Ormlite框架简单的操作数据库

    大家在Android项目中或多或少的都会使用数据库,为了提高我们的开发效率,当然少不了数据库ORM框架了,尤其是某些数据库操作特别频繁的app:本篇博客将详细介绍ORMLite的简易用法. 下面开始介 ...

  2. [ 转]Android快速开发–使用ORMLite操作数据库

    OrmLite是一个数据库操作辅助的开源框架,主要面向Java语言.在Android面向数据库开发中,是一个比较流行的开源框架,方便操作而且功能强大,今天来学习一下,最近的项目中也有所涉及,写个博客来 ...

  3. android一分钟学会可视化操作数据库(无需ROOT)

    我刚开始弄android数据库的时候,想查询一些数据,以验证程序逻辑,发现很多方案都需要ROOT. 即便有不需要ROOT的方案,命令行交互也比较麻烦. 今天跟大家分享一下这个点点鼠标就能实现的功能. ...

  4. Android开发12——Andorid中操作数据库的insert的两种方法以及nullColumnHack

    一.发现问题 先看两种方法插入数据 public void save(Person p){ SQLiteDatabase db = dbHelper.getWritableDatabase(); db ...

  5. Dojo初探之4:dojo的event(鼠标/键盘)事件绑定操作(基于dojo1.11.2版本)

    前言: 上一章详解了dojo的dom/query操作,本章基于dom/query基础上进行事件绑定操作 dojo的事件 dojo的事件绑定操作分为鼠标和键盘两种进行详解 1.鼠标事件 我们沿用上一章中 ...

  6. .26-浅析webpack源码之事件流make(1)

    compilation事件流中,依然只是针对细节步骤做事件流注入,代码流程如图: // apply => this-compilation // apply => compilation ...

  7. 小米红米1 android 4.4.4上操作数据库异常问题

    产生的问题: 小米红米1 android 4.4.4上,按HOME键,应用进入后台,再启动,应用进程直接挂掉 解决的方法: 这个是操作数据库,数据库关闭之后导致的异常,解决的方法: //4.0以上的版 ...

  8. Android学习之基础知识九 — 数据存储(持久化技术)之使用LitePal操作数据库

    上一节学习了使用SQLiteDatabase来操作SQLite数据库的方法,接下来我们开始接触第一个开源库:LitePal.LitePal是一款开源的Android数据库框架,它采用了对象关系映射(O ...

  9. Android持久化存储——(包含操作SQLite数据库)

    <第一行代码>读书手札 你可能会遇到的问题:解决File Explorer 中无显示问题 Android中,持久化存储,常见的一共有三种方法实现 (一.)利用文件存储 文件存储是Andro ...

随机推荐

  1. LM-Sensors unable to load driver module

    Fix - sort of - for LM-Sensors unable to load driver module In short: In /etc/default/grub set GRUB_ ...

  2. 漫谈Puppet4

    激动人心的改进 速度,速度,还是速度 稳定性和鲁棒性的提升 全新的Parser “不变"的agent 不兼容的改动 包管理方式的变化 配置文件/目录的路径变化 其他路径变化 Director ...

  3. Docker实践(5)—资源隔离

    Docker使用cgroup实现CPU,内存和磁盘IO等系统资源的限制. CPU Docker现在有2个与CPU资源相关的参数,-c可以指定CPU的占比,--cpuset可以绑定CPU.例如,指定容器 ...

  4. RDD分区2GB限制

    本文目的   最近使用spark处理较大的数据时,遇到了分区2G限制的问题(ken).找到了解决方法,并且在网上收集了一些资料,记录在这里,作为备忘.   问题现象   遇到这个问题时,spark日志 ...

  5. [SQL SERVER 2005]数据库差异备份及还原

    因为之前遇到还原差异备份,最开始遇到SQLServer报错:”无法还原日志备份或差异备份,因为没有文件可用于前滚“.查阅很多资料后,终于得到解决.收集整理成这篇随笔. 问题原因:出现这种错误绝大多数是 ...

  6. Android SDK在线更新镜像服务器大全

    http://www.androiddevtools.cn/ 原文:http://www.jb51.net/article/73732.htm 由于一些原因,Google相关很多服务都无法访问,所以在 ...

  7. struts2:拦截器

    拦截器(Interceptor)是Struts 2的核心组件,Struts 2框架的大部分功能都是通过拦截器来完成的,例如数据校验,国际化,文件上传和下载等.为了实现这些功能,Struts 2框架提供 ...

  8. Spring源码追踪4——SpringMVC View解析

    这次的议题是返回json和返回普通view经过的路线差异. ---------------------------------------------------------------------- ...

  9. JCEF3——谷歌浏览器内核Java版实现(一):使用jawt获取窗体句柄

    前言 最近一段时间研究谷歌浏览器内核.谷歌浏览器内核一直开源,并维护更新,它的开源项目中内核更新速度和Chrome浏览器版本更新进度一样!而且它不同于WebKit(值得一题的是谷歌浏览器已不使用Web ...

  10. Android客户端与PHP服务端交互(一)---框架概述

    背景 作为一个普通上班族,总是想做一些自认为有意义的事情,于是乎准备成立一个工作室,尽管目前正在筹备阶段,但是之前有些朋友提出一些需求的时候,我发现自己的能力还是有限,直到最近和一些技术牛朋友聊起这事 ...