1 前言
在Android开发中往往会保存和使用各种数据,这些数据按照存储来分,大概会分为3类,第一是保存在内存中的数据,第二是保存在SharedPreferences中数据,第三是保存在SQL数据库中。为了统一管理及访问,使上层应用忽略掉这些差异,及为了减少对SQL及SharedPreferences的操作,往往会对这些进行封装,之前在网络上看到的大多都是对SharedPreferences进行封装,但是这里要介绍一个数据框架,它封装了对内存数据,SharedPreferences,SQL数据的访问,从而方便程序的管理及上层应用层的访问,使应用层的代码更简洁。
该数据框架就叫它数据中心DataCenter框架
2 数据中心框架DataCenter简图
数据中心提供的功能:
1 对数据的存储功能,可按照应用需求,将数据分别存储到内存,SharedPreferences,SQL中
2 对数据的访问,主要是对存储的数据的访问。
数据中心DataCenter的简图如下:
数据中心的整体框架如上图,下面依次介绍几个主要的部分。
DataManager提供对外的接口,主要是提供数据变化观察者DataObserver的注册与反注册,另外提供一系列访问数据的接口,例如getUri(),getString\int\Double(),setString\Int\Double()等接口,访问基本类型的数据,对于除了String类型的引用类型数据,可以考虑采用序列化的形式,序列化成String类型的数据存储。反之也一样。
对数据的访问遵循下面两大步骤。
1 获取该数据对应的uri
2 根据uri进行数据的存储或者读取
DataCenterProxy的主要作用就是解耦,这里解耦的方式主要是运用观察者模式,防止DataManager与DataCenter的耦合太紧,另外还包含对数据的有效性及合法性的校验。
DataCenter主要就是对数据访问的实现,首先根据uri来判断是何种类型,内存数据,SP数据,还是SQL数据,并实现好这几种类型的数据。另外,当数据发生变化时,还应该通知DataManager从而通知感兴趣的使用者。
注:这里DataManager与DataCenter的解耦,可以用观察者模式,也可以用Binder模式来解耦,DataManager 作为Client,DataCenter 作为Server,当数据变化时,可以通过客户端向服务端注册监听器,服务端来回调给客户端。
3 数据中心框架DataCenter的设计思路及实现
有了上面的粗略的框架,我们可以根据框架设计更详细的UML类图,如下:
几点说明:
1 DataManager对外提供接口主要是以下几个接口
在DataCenterProxy中会将这些数据转为String类型。同时getString()也是一样,也会在DataCenterProxy中做处理。
2 DataCenter对外提供的接口只有以下几个
/**
* 保存值
* @param uri
* @param value
*/
public void setStringValue(String uri,String value);
/**
* 获取值
* @return
*/
public String getStringValue(String uri);
/**
* 删除指定uri的数据
* @param uri
*/
public void deleteStringValue(String uri);
同时,DataCenter持有IDataBuffer对象,DataCenter会根据uri解析出该数据是那种类型的存储,内存,SP,还是SQL数据库。读取也是一样。当存储数据或者删除数据时,通知IDataCenterObserver数据发生变化或者发生了删除操作
3 IDataBuffer规定了数据的操作,主要是三类,存储,读取,删除
下面依次有对内存数据,SP数据,SQL数据的实现。
这里充分的体现了面向对象的六大设计原则,高层之间依赖于抽象,不依赖细节。
关于该框架的详细代码,这里就不贴出来了,是在代码太多,请参考我的github
https://github.com/qiyei2015/EssayJoke 中SDK 下的dc目录
4 数据中心DataCenter框架的优化方向
关于这套框架,我会在后续的开发中不断的优化,同时这里给出可以优化的两个点
1 缓存的设计
缓存的设计还是还有必要的,它可以提高数据的访问速度,对性能的影响比较大,特别对保存在磁盘上的数据而言,因此可以在DataManager 中设计缓存机制,从而保证对SP,SQL 等类型数据的访问速度。缓存可以参考LRU算法。
2 保存对象型,集合型(List,Map)等类型的数据
当前的数据中心框架,目前只能实现对基本类型,以及String类型的数据的访问,后期可以考虑对普通对象的数据的访问,可以使用序列化来实现。另外对于List型,Map型,Bundle型的数据访问也要支持
3 数据中心DataCenter内存优化
关于数据中心DataCenter的优化,内存优化是一个重点,特别是当有太多的数据保存在内存中,而且又引入了缓存设计了情况,对内存的优化特别重要。个人建议:
1. 缓存采用LRU算法,设置一个阈值从而保证内存的使用量
2. 对保存在内存中,使用频率比较低的值建议直接保存在SP或SQL中,降低内存的使用率