一个简单的数据增量更新策略(Android / MongoDB / Django)
我在做个人APP - CayKANJI - 的时候遇到一个问题:
如何增量式地把日语汉字数据地从server更新到APP端,即每次用户运行更新操作时,仅仅获取版本号高于本地缓存的内容。
数据格式
为了可以与mongoDB无缝结合,并省去编写后台代码的麻烦,索性就把汉字数据保存成json文件,上传到server后。交给web应用去读取并写入数据库。
汉字文件就是普通的json格式。
{
"category": "行為ー2",
"contents": [
{
"kanji" : "尋",
"on-yomi" : "ジン",
"kun-yomi" : "たず-ねる",
"examples": ["不明な点を尋ねる", "行方を尋ねて回る", "由来を尋ねる", "警官が怪しい男に尋問する", "尋常ではない行動"]
},
{
"kanji" : "促",
"on-yomi" : "ソク",
"kun-yomi" : "うなが-す",
"examples": ["成長を促す", "発言を促す", "販売を促進する", "支払いを催促する"]
}
]
}
数据库操作
然后利用不同的目录做一个队列,未被写入数据库的文件放在pending目录。已经写入的放在finished目录。
这样当webserver接收到第一次更新请求时,会检測pengding目录下是否有新的json文件,有的话就写入到数据库。并把json文件移动到finished目录。
web端用的是Django
框架,使用pymongo
操作数据库。
数据写入
def write_to_db(self, path):
with open(path) as my_file:
self._db.kanji.insert(json.loads(my_file.read()))
def check_update(self):
for (path, dirs, files) in os.walk(self.PENDING_DIR):
for file in files:
self.write_to_db(os.path.join(path, file)) # move sync-over file into 'finished' directory
shutil.move(os.path.join(path, file), os.path.join(self.FINISHED_DIR, file))
把json数据同步到数据库后,就能够在Android端发起请求来获取数据。
可是。这样做并不能在手机端实现增量更新,每次请求都会下载数据库中全部的数据。事实上解决的方法也非常easy。给每条json数据加上一个版本号就搞定了。
增量数据的版本号控制
改动之前的json文件。加入一个version字段。
{
"category": "行為ー2",
"version" : 0,
"contents": [
{
"kanji" : "尋",
"on-yomi" : "ジン",
"kun-yomi" : "たず-ねる",
"examples": ["不明な点を尋ねる", "行方を尋ねて回る", "由来を尋ねる", "警官が怪しい男に尋問する", "尋常ではない行動"]
},
{
"kanji" : "促",
"on-yomi" : "ソク",
"kun-yomi" : "うなが-す",
"examples": ["成長を促す", "発言を促す", "販売を促進する", "支払いを催促する"]
}
]
}
数据读取
数据请求RESTfull
风格的url - http://www.liangfeizc.com/catykanji/download/0
download后面的数字表示这次请求的最低版本,server收到这个请求后会返回全部版本大于等于0的数据。
首先在url.py中加入url规则
url(r'^download/(?P<version>\d+)$', 'download_kanji'),
然后在view.py中加入download_kanji
函数
def download_kanji(request, version=0):
kanji = _mongo.get_kanji(int(version))
return HttpResponse(kanji, content_type="application/json")
读取大于等于version的数据
def get_kanji(self, version):
# check pending dir to see if there's any file
self.check_update()
result = self._db.kanji.find({"version": {"$gte": version}})
return json_util.dumps(result)
搞定了web端的增量更新规则。Android就没什么问题了。
Android端
Android的HTTP请求使用了AOSP的Volley
库,仅仅要把uri拼接好,加入到Volley的RequestQueue就能够了。
每次从server返回请求数据时,解析json文件后把最大的version的值加1后保存到Preference中。再次发送请求的时候直接从Preference中读取这个版本号。拼接成一个请求指定版本号号的url就能够了。
最后把解析完的json数据分成三个表保存到的数据库就大公告成了。源代码能够看
一个简单的数据增量更新策略(Android / MongoDB / Django)的更多相关文章
- Kettle中通过触发器方式实现数据 增量更新
在使用Kettle进行数据同步的时候, 共有 1.使用时间戳进行数据增量更新 2.使用数据库日志进行数据增量更新 3.使用触发器+快照表 进行数据增量更新 今天要介绍的是第3中方法. 实验的思路是这样 ...
- odi增量更新策略
增量更新策略:通过一个“update key”比较流数据记录与目标表中的记录比较进行数据整合.具有相同“update key”的记录当相关联列不同时将被更新:在目标表中不存在的记录将被插入.这种方式用 ...
- spring boot: @Entity @Repository一个简单的数据读存储读取
spring boot: @Entity @Repository一个简单的数据读存储读取 创建了一个实体类. 如何持久化呢?1.使用@Entity进行实体类的持久化操作,当JPA检测到我们的实体类当中 ...
- **app后端设计(10)--数据增量更新(省流量)
在新浪微博的app中,从别的页面进入主页,在没有网络的情况下,首页中的已经收到的微博还是能显示的,这显然是把相关的数据存储在app本地. 使用数据的app本地存储,能减少网络的流量,同时极大提高了用户 ...
- app后端设计(10)--数据增量更新
在新浪微博的app中,从别的页面进入主页,在没有网络的情况下,首页中的已经收到的微博还是能显示的,这显然是把相关的数据存储在app本地. 使用数据的app本地存储,能减少网络的流量,同时极大提高了用户 ...
- Android 6.0 7.0 8.0 一个简单的app内更新版本-okgo app版本更新
登陆时splash初始页调用接口检查app版本.如有更新,使用okGo的文件下载,保存到指定位置,调用Android安装apk. <!-- Android 8.0 (Android O)为了针对 ...
- 一个简单的数据查询显示jsp
以前使用jstl标签库只是使用core来显示一些数据,非常方便,今天看了下发现jstl还有其他的标签,使用都非常方便, 1.sql标签,可以直接访问数据库,后台代码都不需要了,这在某些时候非常适合使用 ...
- 分享给大家一个简单的数据导出excel类
<?php /** * 生成excel文件操作 * * @author wesley wu * @date 2013.12.9 */ class Excel { private $limit = ...
- 一个简单xml数据转换为数组的方法
本人用easywechat做微信回复图文,从数据库中拿到的数据直接是xml拼好的数据,但是框架只有自带的获取xml格式的语句,所有需要将xml数据中所需要的数据拿出来用来拼接. 搜了好多资料说的都很麻 ...
随机推荐
- cake-walk
Of course it was not a cake-walk in the beginning 3. This is going to be a cakewalk 这将易如反掌. 4. Julia ...
- 个人博客 V0.0.3 版本 ...
早就想弄个人博客网站,一直拖到现在...事情总是忙不完的,想能力提升的快,只能挤时间多练多写了,Keep On Unsleeping 以后原创的笔记都会在自己的博客网站写,博客园和简书就用来转发文章了 ...
- 【教训】null == '',改造ThinkSNS 系统里面的一个缓存管理函数S()后,留下一个大bug
本来想简化 ThinkSNS 系统里面的一个缓存管理函数: <?php /** * 用来对应用缓存信息的读.写.删除 * $expire = null/0 表示永久缓存,否则为缓存有效期 */ ...
- openfire源码研究笔记:对设计模式及原则的学习
原文:http://blog.csdn.net/jinzhencs/article/details/50522105 一.拦截器的实现 地点: package org.jivesoftware.o ...
- JS方面重点摘要(二)
1.函数声明与函数表达式 (1)变量声明会置顶提前,但赋值仍在原地方(2)函数声明同变量声明一样会提前:但是,函数表达式没有提前,就相当于平时的变量赋值(3)函数声明会覆盖变量声明,但不会覆盖变量赋值 ...
- 关于计算机中的《补码》,公式:-n=~n+1 引伸:~n=-n-1
在计算机系统中,数值一律用补码来表示(存储).主要原因是使用补码可以将符号位和其他位统一处理:同时,减法也可以按加法来处理.另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃.补 ...
- Apache环境下搭建KodExplorer网盘
Apache环境下搭建KodExplorer网盘 环境说明: 系统版本 CentOS 6.9 x86_64 软件版本 yum安装httpd和php kodexplorer4.25 1 ...
- 配置 FIS 来适配 go revel 框架以优化前端缓存策略
对于前端工程师来说,浏览器缓存优化是个永远的话题.前几天看了知乎上的一个问答:<大公司里怎样开发和部署前端代码?>,深以为然,所以决心使用 FIS 来优化自身的前端文件. 我们的项目使用了 ...
- 【原创】关于bug反正出现的问题可能
bug修正的问题:1. xib问题.2. 模块不清同时修改.3. svn代码合并的修改熟悉程度.4. 禁止全局格式化代码.
- SSO单点登录系列4:cas-server登录页面自定义修改过程(jsp页面修改)
落雨 cas 单点登录 SSO单点登录系列4:cas-server登录页面自定义修改过程,全新DIY. 目标: 下面是正文: 打开cas的默认首页,映入眼帘的是满眼的中文and英文混杂体,作为一 ...