2013-03-05 2 views
0

У меня есть файл XML, который я обрабатываю в своем приложении для Android. Я не хотел бы анализировать его, если файл не был изменен.Простой способ проверить, изменился ли файл на сервере без загрузки

я могу получить время, когда мой файл был последний доработан, и я могу получить дату последнего изменения из заголовка сервера в GMT, но я не уверен, что теперь делать ...

//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!"); 
    } 

EDIT :::::::::

Как это выглядит?

В итоге я убедился, что две даты не совпадают с использованием 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

Hi atreat, спасибо за комментарий. Таким образом, XML-файл сервера должен иметь связанный с ним MD5, а затем мое приложение расшифровывает это и сравнивает? Я не уверен, что XML-файл имеет это. Если я попробую status.getHeader («Content-MD5»); Я получаю нуль ... так что, полагаю, нет. Есть предположения? – jasonflaherty

+0

MD5 - это не то, что файл будет содержать. если вы перейдете в командную строку UNIX, вы можете ввести «md5 », чтобы увидеть MD5 файла. В основном то, что он делает, это хруст битов вашего файла в уникальную строку. Если файл изменится, MD5 также изменится. Я бы прочитал алгоритм хэширования MD5 и другие алгоритмы хеширования. Они могут быть очень полезными. – atreat

+0

Да, это то, что нужно создать на уровне сервера? Тогда я могу использовать getHeader(), чтобы получить его? – jasonflaherty

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

+0

Я имею в виду, не так ли ... – jasonflaherty

+0

@buildakicker, это проверка равенства. Если вы замените '! =' Whith '>', то это будет означать, что serverTime после вашего времени и вы должны обновить свой файл –

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

Смежные вопросы