最近在浏览某篇有关事件流的文章时,里面提到了数据的流处理,兴趣来了,就想看看能否在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. NEWS - InstallShield 2013 SP1发布

    2013的这个国庆假期期间,InstallShield厂商Flexerasoftware(中文名:福莱睿)发布了最新版本InstallShield 2013的SP1,由于这个升级包带来一些新的技术支持 ...

  2. Swift入门篇-结构体

    前面主要是介绍swift语言中基本类型的用法,今天给大家介绍的是swift的结构体的用法,swift中结构体的用法和其他语言的用法,还有不太一样,不过您多敲几遍,就可以理解结构体,结构体在ios开发中 ...

  3. 源代码安装 MySQL 5.6.28

    本文内容 创建 MySQL 用户和组 解压 MySQL 源代码包 生成配置安装文件 编译和安装 MySQL 配置文件 创建 MySQL 授权表 MySQL 目录授权 启动 MySQL 验证 MySQL ...

  4. libevent

    libevent doc example #include <event2/event.h> void cb_func(evutil_socket_t fd, short what, vo ...

  5. 【LeetCode】257. Binary Tree Paths

    Binary Tree Paths Given a binary tree, return all root-to-leaf paths. For example, given the followi ...

  6. Goldengate进程的拆分与合并

    Goldengate的拆分与合并分类: ORACLE GoldenGate 2013-10-10 15:22 721人阅读 评论(0) 收藏 举报在使用Goldengate作为复制解决方案时,随着负载 ...

  7. Eclipse shortcuts

    Editor Shortcut Description Alt + / Content assist. A great help for our coding. Ctrl + Shift + F Fo ...

  8. __getattribute__()、__getattr__()、__setattr__()、__delattr__()

    访问顺序: 实例的__getattribute__().Descriptor的__get__().实例的__dict__.只读Descriptor的__get__().实例的__getattr__() ...

  9. 用 Jenkins 打包 iOS

    需要安装插件: 1.GIT plugin 2.Xcode integration   1.新建 Job 填入“Item名称”,选择“构建一个自由风格的软件项目”,OK:   2.填入“项目名称”   ...

  10. Singleton<T>

    代码如下: public class Singleton<T> where T : class { private static T _instance; private static r ...