Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 一個簡單的數據增量更新策略(Android / MongoDB / Django)

一個簡單的數據增量更新策略(Android / MongoDB / Django)

編輯:關於Android編程

我在做個人APP - 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\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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved