Anroid 数据持久化方案
2016-01-04 12:02
239 查看
Android有几种数据的保存方案,让我们可以尽量的减少对网络的消耗,优化用户体验。让我来给大家介绍一下吧:
1.数据库:
Android的数据库使用的是SQLlite,这是一个轻量级关系型数据库。大家既可以继承SqliteOpenHelper来进行数据库的管理,也可以使用第三方框架。我接下来会介绍第三方框架OrmLite的使用
2.SharedPreference:
轻量级存储:主要用来存储一些简单的配置信息。例如用户名和密码,方便下一次登录就不用输入用户名密码,直接登入;
3.文件存储:直接存储到本地文件中;
4.ContentProvider:
数据库在Android当中是私有的,不能将数据库设为WORLD_READABLE,每个数据库都只能创建它的包访问。这意味着只有创建这个数据库的应用程序才可访问它。也就是说不能跨越进程和包的边界,直接访问别的应用程序的数据库。那么如何在应用程序间交换数据呢? 如果需要在进程间传递数据,可以使用ContentProvider来实现。
其他应用程序都可以通过该接口来操作被暴露的内部数据,包括增加数据、删除数据、修改数据、查询数据等。
虽然大部分使用ContentProvider操作的数据都来自于数据库,但是也可以来自于文件、SharedPreferences、XML或网络等其他存储方式
5.网络存储
这个就不用说了吧~
那么存储方式有了,那什么时候使用存储呢?
1、网络数据刷新不频繁的
在此种情况下网络数据数据的频率并不是很高,并且对数据的实时显示要求也不是很高,例如一些电商平台的商品显示列表数据。在这种情况下,数据比如每过1个小时才刷新一次,这样我们就没必要每次都去从网络上请求数据,可给数据设置一个超时值,当然这个超时值应该小于数据刷新的时间,例如如果数据刷新是1小时一次,那么我们可以把缓存的超时值设置成30分钟,10分钟,或者5分钟。这样就会既可以保证数据的快速显示又不会影响用户获得最新的数据。在这种情况下的业务逻辑如下:
[java] view
plaincopy
if(网络可用){
if(本地存在对应缓存&&缓存没有过期&&非刷新操作){
返回本地;
}else{
进行网络请求;
存储网络数据到本地;//(可以使用文件或sqllite)
返回网络数据;
}
}else{
if(刷新操作){
提示无网络状态下刷新操作不可用;
}else{
if(本地存在对应缓存){
返回本地缓存
}else{
返回空;
}
}
}
2、网络数据刷新较频繁的
如果网络数据刷新较为频繁,比如贴吧,说说什么的。就不能用上面所说的缓存机制,因为这种对数据的实时性要求比较高,这种情况下所需要的缓存机制也仅仅是稍微改善一下用户的使用体验,让用户刚刚进来的时候有内容可以看。这种情况下的缓存逻辑如下:
[java] view
plaincopy
if(网络可用){
if(本地存在对应缓存){
在界面中先设置本地数据;
}
发出网络请求。
网络请求数据存储到本地。
等网络请求结束用新的数据刷新界面。
}else{
if(本地存在对应缓存){
在界面中设置本地数据;
}else{
界面中提示没有数据,或者网络不可用。
}
}
以上就是较为常用的网络缓存的两种实现思路。另外要说明的就是把网络数据存储到本地的具体技术,可以使用sqllite进行存储,也可以使用文件进行存储,如果使用文件存储建议建立一个文件夹,并且以每个url对应的hashcode码为文件名,这样存储比较清晰,并且计算超时值时可以直接用当前时间减去文件的修改时间就可以了,如果是用sqllite数据库存储,存储的时候应该存储对应的url,时间戳,和内容。
,
1.数据库:
Android的数据库使用的是SQLlite,这是一个轻量级关系型数据库。大家既可以继承SqliteOpenHelper来进行数据库的管理,也可以使用第三方框架。我接下来会介绍第三方框架OrmLite的使用
2.SharedPreference:
轻量级存储:主要用来存储一些简单的配置信息。例如用户名和密码,方便下一次登录就不用输入用户名密码,直接登入;
3.文件存储:直接存储到本地文件中;
4.ContentProvider:
数据库在Android当中是私有的,不能将数据库设为WORLD_READABLE,每个数据库都只能创建它的包访问。这意味着只有创建这个数据库的应用程序才可访问它。也就是说不能跨越进程和包的边界,直接访问别的应用程序的数据库。那么如何在应用程序间交换数据呢? 如果需要在进程间传递数据,可以使用ContentProvider来实现。
其他应用程序都可以通过该接口来操作被暴露的内部数据,包括增加数据、删除数据、修改数据、查询数据等。
虽然大部分使用ContentProvider操作的数据都来自于数据库,但是也可以来自于文件、SharedPreferences、XML或网络等其他存储方式
5.网络存储
这个就不用说了吧~
那么存储方式有了,那什么时候使用存储呢?
1、网络数据刷新不频繁的
在此种情况下网络数据数据的频率并不是很高,并且对数据的实时显示要求也不是很高,例如一些电商平台的商品显示列表数据。在这种情况下,数据比如每过1个小时才刷新一次,这样我们就没必要每次都去从网络上请求数据,可给数据设置一个超时值,当然这个超时值应该小于数据刷新的时间,例如如果数据刷新是1小时一次,那么我们可以把缓存的超时值设置成30分钟,10分钟,或者5分钟。这样就会既可以保证数据的快速显示又不会影响用户获得最新的数据。在这种情况下的业务逻辑如下:
[java] view
plaincopy
if(网络可用){
if(本地存在对应缓存&&缓存没有过期&&非刷新操作){
返回本地;
}else{
进行网络请求;
存储网络数据到本地;//(可以使用文件或sqllite)
返回网络数据;
}
}else{
if(刷新操作){
提示无网络状态下刷新操作不可用;
}else{
if(本地存在对应缓存){
返回本地缓存
}else{
返回空;
}
}
}
2、网络数据刷新较频繁的
如果网络数据刷新较为频繁,比如贴吧,说说什么的。就不能用上面所说的缓存机制,因为这种对数据的实时性要求比较高,这种情况下所需要的缓存机制也仅仅是稍微改善一下用户的使用体验,让用户刚刚进来的时候有内容可以看。这种情况下的缓存逻辑如下:
[java] view
plaincopy
if(网络可用){
if(本地存在对应缓存){
在界面中先设置本地数据;
}
发出网络请求。
网络请求数据存储到本地。
等网络请求结束用新的数据刷新界面。
}else{
if(本地存在对应缓存){
在界面中设置本地数据;
}else{
界面中提示没有数据,或者网络不可用。
}
}
以上就是较为常用的网络缓存的两种实现思路。另外要说明的就是把网络数据存储到本地的具体技术,可以使用sqllite进行存储,也可以使用文件进行存储,如果使用文件存储建议建立一个文件夹,并且以每个url对应的hashcode码为文件名,这样存储比较清晰,并且计算超时值时可以直接用当前时间减去文件的修改时间就可以了,如果是用sqllite数据库存储,存储的时候应该存储对应的url,时间戳,和内容。
,
相关文章推荐
- Python学习笔记(1)
- 通过Smart HTTP提供代码下载/上传服务
- eclipse最有用快捷键整理 by 戎码一生
- 初学AsyncTask
- Filestream/Windows Share导致Alwayson Failover失败
- PHP在线书签系统分享
- ArcGIS教程:了解坡度
- How to create a Maven web app and deploy to Tomcat - fast
- AtomicInteger
- poj--3278
- SVM学习笔记(二)----手写数字识别
- Android:Activity:生命周期
- Struts2 集成 sitemesh配置
- [转]MySQL 5.7 新特性大全和未来展望
- JQuery调用iframe子页面函数/对象的方法
- java.net.UnknownHostException
- Android中无返回值的页面跳转
- 字符串转换成整数
- java中判断一个字符串是否“都为数字”和“是否包含数字”和“截取数字”
- ntp 同步网络时间