Android上的事件流操作数据库
最近在浏览某篇有关事件流的文章时,里面提到了数据的流处理,兴趣来了,就想看看能否在Android端实现一个。
根据文章的介绍,将每次数据的变更事件,像是插入,删除或者更新等,记为一个不可变的事件,让数据在事件中流淌,而不是对数据库进行破坏性的写入,也就是说,直接读取数据的聚合结果就能获取最好的性能。
事件流可以完成下面的工作:
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上的事件流操作数据库的更多相关文章
- Android—Ormlite框架简单的操作数据库
大家在Android项目中或多或少的都会使用数据库,为了提高我们的开发效率,当然少不了数据库ORM框架了,尤其是某些数据库操作特别频繁的app:本篇博客将详细介绍ORMLite的简易用法. 下面开始介 ...
- [ 转]Android快速开发–使用ORMLite操作数据库
OrmLite是一个数据库操作辅助的开源框架,主要面向Java语言.在Android面向数据库开发中,是一个比较流行的开源框架,方便操作而且功能强大,今天来学习一下,最近的项目中也有所涉及,写个博客来 ...
- android一分钟学会可视化操作数据库(无需ROOT)
我刚开始弄android数据库的时候,想查询一些数据,以验证程序逻辑,发现很多方案都需要ROOT. 即便有不需要ROOT的方案,命令行交互也比较麻烦. 今天跟大家分享一下这个点点鼠标就能实现的功能. ...
- Android开发12——Andorid中操作数据库的insert的两种方法以及nullColumnHack
一.发现问题 先看两种方法插入数据 public void save(Person p){ SQLiteDatabase db = dbHelper.getWritableDatabase(); db ...
- Dojo初探之4:dojo的event(鼠标/键盘)事件绑定操作(基于dojo1.11.2版本)
前言: 上一章详解了dojo的dom/query操作,本章基于dom/query基础上进行事件绑定操作 dojo的事件 dojo的事件绑定操作分为鼠标和键盘两种进行详解 1.鼠标事件 我们沿用上一章中 ...
- .26-浅析webpack源码之事件流make(1)
compilation事件流中,依然只是针对细节步骤做事件流注入,代码流程如图: // apply => this-compilation // apply => compilation ...
- 小米红米1 android 4.4.4上操作数据库异常问题
产生的问题: 小米红米1 android 4.4.4上,按HOME键,应用进入后台,再启动,应用进程直接挂掉 解决的方法: 这个是操作数据库,数据库关闭之后导致的异常,解决的方法: //4.0以上的版 ...
- Android学习之基础知识九 — 数据存储(持久化技术)之使用LitePal操作数据库
上一节学习了使用SQLiteDatabase来操作SQLite数据库的方法,接下来我们开始接触第一个开源库:LitePal.LitePal是一款开源的Android数据库框架,它采用了对象关系映射(O ...
- Android持久化存储——(包含操作SQLite数据库)
<第一行代码>读书手札 你可能会遇到的问题:解决File Explorer 中无显示问题 Android中,持久化存储,常见的一共有三种方法实现 (一.)利用文件存储 文件存储是Andro ...
随机推荐
- c/c++ 输入输出缓冲区
关于缓冲区的详细介绍,请参考 C++编程对缓冲区的理解 CPP的输入输出流和缓冲区 c++输出缓冲区刷新 (1)c++中cin.cout,cerr和c的stdin.stdout.stderr都是同 ...
- 【linux】文件隐藏属性
这些隐藏的属性确实对于系统有很大的帮助的- 尤其是在系统安全 (Security) 上面,重要的紧呢!不过要先强调的是,底下的chattr指令只能在Ext2/Ext3的文件系统上面生效, 其他 ...
- MySql 执行语句错误 Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
关于用Power Designer 生成sql文件出现 错误 [Err] 1064 - You have an error in your SQL syntax; check the manual ...
- EF5.0增删改查的写法及执行Sql的方法
public T AddEntity(T entity) { //EF4.0的写法 添加实体 //db.CreateObjectSet<T>().AddObject(entity); // ...
- Conway's Game of Life: An Exercise in WPF, MVVM and C#
This blog post was written for the Lockheed Martin Insight blog, sharing here for the external audie ...
- Android学习之ProgressBar
ProgressBar用于向用户显示某个耗时操作完成的百分比,避免长时间执行某个耗时操作时让用户感觉程序失去了响应,从而提高用户界面的友好性. 请看下面的界面布局: <LinearLayout ...
- 8 个最优秀的 Android Studio 插件
Android Studio是目前Google官方设计的用于原生Android应用程序开发的IDE.基于JetBrains的IntelliJ IDEA,这是Google I/O 2013第一个宣布的作 ...
- POJ 3320 Jessica's Reading Problem
Jessica's Reading Problem Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6001 Accept ...
- 谈谈CSS预处理技术中for循环的应用-CSS Sprite
各种新技术的出现,推动着Web前端技术飞速发展,在提升用户体验的同时也方便开发者: 在前端优化时,我们使用CSSSprite技术,把多个图片合在一张图片上,然后通过background-image,b ...
- 基于Eclipse搭建Hadoop源码环境
Hadoop使用ant+ivy组织工程,无法直接导入Eclipse中.本文将介绍如何基于Eclipse搭建Hadoop源码环境. 准备工作 本文使用的操作系统为CentOS.需要的软件版本:hadoo ...