一个简单的数据增量更新策略(Android / MongoDB / Django)
2014-10-15 22:49
435 查看
我在做个人APP -
CayKANJI - 的时候遇到一个问题:
怎样增量式地把日语汉字数据地从服务器更新到APP端,即每次用户执行更新操作时,只获取版本高于本地缓存的内容。
汉字文件就是普通的json格式。
web端用的是
把json数据同步到数据库后,就可以在Android端发起请求来获取数据。但是,这样做并不能在手机端实现增量更新,每次请求都会下载数据库中所有的数据。其实解决办法也很简单,给每条json数据加上一个版本就搞定了。
download后面的数字表示这次请求的最低版本号,服务器收到这个请求后会返回所有版本号大于等于0的数据。
首先在url.py中添加url规则
然后在view.py中添加
读取大于等于version的数据
搞定了web端的增量更新规则,Android就没什么问题了。
每次从服务器返回请求数据时,解析json文件后把最大的version的值加1后保存到Preference中,再次发送请求的时候直接从Preference中读取这个版本,拼接成一个请求指定版本号的url就可以了。
最后把解析完的json数据分成三个表保存到的数据库就大公告成了,源码可以看
https://github.com/LyndonChin
CayKANJI - 的时候遇到一个问题:
怎样增量式地把日语汉字数据地从服务器更新到APP端,即每次用户执行更新操作时,只获取版本高于本地缓存的内容。
数据格式
为了能够与mongoDB无缝结合,并省去编写后台代码的麻烦,索性就把汉字数据保存成json文件,上传到服务器后,交给web应用去读取并写入数据库。汉字文件就是普通的json格式。
{ "category": "行為ー2", "contents": [ { "kanji" : "尋", "on-yomi" : "ジン", "kun-yomi" : "たず-ねる", "examples": ["不明な点を尋ねる", "行方を尋ねて回る", "由来を尋ねる", "警官が怪しい男に尋問する", "尋常ではない行動"] }, { "kanji" : "促", "on-yomi" : "ソク", "kun-yomi" : "うなが-す", "examples": ["成長を促す", "発言を促す", "販売を促進する", "支払いを催促する"] } ] }
数据库操作
然后利用不同的文件夹做一个队列,未被写入数据库的文件放在pending文件夹,已经写入的放在finished文件夹。这样当web服务器接收到第一次更新请求时,会检测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端发起请求来获取数据。但是,这样做并不能在手机端实现增量更新,每次请求都会下载数据库中所有的数据。其实解决办法也很简单,给每条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后面的数字表示这次请求的最低版本号,服务器收到这个请求后会返回所有版本号大于等于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就可以了。
每次从服务器返回请求数据时,解析json文件后把最大的version的值加1后保存到Preference中,再次发送请求的时候直接从Preference中读取这个版本,拼接成一个请求指定版本号的url就可以了。
最后把解析完的json数据分成三个表保存到的数据库就大公告成了,源码可以看
https://github.com/LyndonChin
相关文章推荐
- 一个简单的数据增量更新策略(Android / MongoDB / Django)
- Android上实现一个简单的天气预报APP(六) 更新界面数据
- Android上实现一个简单的天气预报APP(九) ListView展示城市列表、单击更新天气数据
- 一个实现数据增量加载的ETL算法(记录新增、更新和删除标志)
- 【Android 网络数据解析实现一个简单的新闻实例(一)】
- Android如何用json格式传数据到后台(SSM) 做一个简单的登录流程
- 【可变参数】数组赋给可变参数,采取的策略是【拆】,简单数据类型数组看成是一个对象
- android硬编码h264数据,并使用rtp推送数据流,实现一个简单的直播-MediaCodec(一)
- [置顶] 一个简单、轻量的Android版本更新库、内置了一个漂亮的更新对话框
- 【Android笔记-异常-4】定义一个临时的数组变量承接数据,ListView的数据以及通知数据更新要放到同一个线程(主线程)。避免出现异常"The content of the adapter
- 一个简单的批量更新oracle 数据库中 最近的服务商名称的数据
- 一个简单的Android Native(C/C++)网络数据加密方案
- Android上实现一个简单的天气预报APP(三) 获取网络数据
- 一个简单、轻量的Android版本更新库、内置了一个漂亮的更新对话框
- 一个简单登陆框的变化+更新了如何连接sql数据库,获得数据集,比较两种方法(数据集和读数据)
- 一个简单的Android客户端从服务器端获取json数据并解析的实现代码
- Android上实现一个简单的天气预报APP(八) 从数据库读取城市数据
- 一个简单的Android Native(C/C++)网络数据加密方案(附带demo)
- SQL之merge into 批量更新数据 Merge关键字是一个神奇的DML关键字。它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句。M
- Django+MongoDB+localStorage做一个简单的权限校验