2013-03-05 23 views
0

我有一個XML文件,我在我的Android應用程序中解析。如果文件沒有被更改,我想不要解析它。簡單的方法來檢查服務器上的文件是否已更改,而無需下載

我能得到的時候,我的文件的最後修改,我可以得到在格林尼治標準時間服務器頭的最後修改日期,但我不知道現在做什麼...

//this is a string: status.getHeader("last-modified"); 
    //Shows like so: Tue, 05 March 2013 16:45:02 GMT 
    String serverlastmodified = status.getHeader("last-modified");  
    Log.e("Header",serverlastmodified); 

    Date s = status.getTime(); 
    String filelastgotten = s.toGMTString(); 
    //String shows like so: 5 Mar 2013 19:41:43 GMT 
    Log.e("LM", filelastgotten); 

//this needs to be a great-than/less-than? 
//But I cannot do that to a string... so change to int? 
    if(serverlastmodified.equals(filelastgotten)){ 
     Log.e(TAG,"YES!"); 
    }else{ 
     Log.e(TAG,"NO!"); 
    } 

編輯:::::::::

這是怎麼回事?

我結束了,只是確保兩個日期不一樣,使用SimpleDateFormat和toGMTString();

String serverLastModified = status.getHeader("last-modified"); 
       SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyy HH:mm:ss zzz"); 

       Date d = null; 
       try { 
        d = sdf.parse(serverLastModified); 
       } catch (ParseException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       Date fileLastGotten = status.getTime(); 

       Log.e("DATE1", d.toGMTString()); 
       Log.e("DATE2", fileLastGotten.toGMTString()); 

       if (d.before(fileLastGotten)) { 
        Log.e("DS", "YES!"); 
       } else { 
        Log.e("DS", "NO!"); 
       } 

回答

0

本地應用程序應該保留您想分析的文件的MD5散列。在請求文件之前,請從服務器請求其MD5。如果這個MD5匹配你的本地MD5而不是請求這個文件。否則,請解析它。如果解析新文件,請不要忘記更新本機MD5。

+0

嗨atreat,感謝您的評論。所以服務器XML文件應該有一個與它相關的MD5,然後我的應用程序會解碼這個並比較?我不確定XML文件是否具有此功能。如果我嘗試使用status.getHeader(「Content-MD5」);我得到空...所以我想不是。有什麼想法嗎? – jasonflaherty 2013-03-05 22:17:49

+0

MD5不是該文件將包含的內容。如果您轉到UNIX命令行,則可以鍵入「md5 」以查看文件的MD5。基本上它所做的就是將文件的各個部分壓縮成一個唯一的字符串。如果文件更改,MD5也會更改。我會閱讀MD5哈希算法和其他哈希算法。它們可能非常有用。 – atreat 2013-03-05 22:23:08

+0

是的,那麼需要在服務器級別創建一些東西?然後我可以使用getHeader()來獲取它? – jasonflaherty 2013-03-05 22:35:03

0

你應該

parese它
try { 
    long serverTime = Date.parse(serverLastModified).getTime(); 
    long myTime = status.getTime.getTime(); 
    if (serverTime != myTime) { 
     //Not equals 
    } else { 
     //equals 
    } 
} catch (Exception e) { 
    //can't parse server string 
} 
+0

這是否只是檢查我的當前時間是否與上次分析文件不同? – jasonflaherty 2013-03-05 21:43:36

+0

我的意思是,是不是... – jasonflaherty 2013-03-05 21:54:24

+0

@buildakicker,這是檢查平等。如果你替換'!='whith'>'那麼這將意味着serverTime在你的時間之後,你應該更新你的文件 – 2013-03-06 10:26:53

1

我剛剛完成了一個開源庫稱爲droidQuery可以通過返回一個錯誤,而不是成功,如果數據沒有被修改完成這一任務給你:

$.ajax(new AjaxOptions(url).type("GET") 
          .dataType("XML") 
          .ifModified(true) 
          .context(this) 
          .success(new Function() { 
           @Override 
           public void invoke($ droidQuery, Object... params) { 
            Document xml = (Document) params[0]; 
            //TODO parse XML Document 
           } 
          }) 
          .error(new Function() { 
           @Override 
           public void invoke($ droidQuery, Object... params) { 
            int status = (Integer) params[1]; 
            if (status == 304) { 
             Log.i("ajax", "data was not modified. No need to parse"); 
            } 
            else { 
             Log.e("ajax", "error: " + (String) params[2]; 
            } 
           } 
          })); 
+0

酷男!我會檢查出來的。看起來有希望:) – jasonflaherty 2013-07-15 13:40:29

相關問題