标签:
最近在浏览某篇有关事件流的文章时,里面提到了数据的流处理,兴趣来了,就想看看能否在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,有兴趣可以上去看看,顺便给个星星。
标签:
原文地址:http://www.cnblogs.com/wenjiang/p/4443093.html