2012-05-01 141 views
1

在我的應用程序中,我得到一個包含信息的url的json。我想將這個json保存在手機中,然後使用json,無論手機是否與url相同。如果json改變了,那麼你應該再次下載json。將JSON保存到系統緩存中

我讓我的JSON恢復和閱讀我的對象,但我會保持在JSON的手機內存,並使用JSON避免下載它再次保存數據

你能幫助我嗎?

一個例子:

public void affichage_phenomene(final String id_phenomene) 
{ 
    if(id_phenomene.length()==0) 
     return; 

    mProgressDialog = ProgressDialog.show(this, "Patientez","Chargement...", true); 

    new Thread((new Runnable() 
    { 
     public void run() 
     { 
      try 
      { 
       JSONArray jsonArray = Json.getJsonByUrl(page_Json); // On récupère un tableau contenant les éléments json   
       JSONObject jsonObject = jsonArray.getJSONObject(0); 
       listItem2 = new ArrayList<HashMap<String, String>>(); 

       map.put("titre", jsonObject.getString("nom")); 
       map.put("description", jsonObject.getString("description")); 
       map.put("liens", jsonObject.getString("liens")); 
       map.put("note_moyenne", jsonObject.getString("note_moyenne")); 
       map.put("img",LoadPicture.loadImageFromWebOperations(getString(R.string.URL_Images)+jsonObject.getString("image"),"/sdcard/MysticWay/phenomene_"+idphenomene+".jpg")); 
       JSONArray liste_lieux = jsonObject.getJSONArray("lieux"); 
       nombre_de_lieux = liste_lieux.length(); 
       if(nombre_de_lieux>0) 
       { 

        for(int i = 0;i<nombre_de_lieux;i++) 
        { 
         map3 = new HashMap<String, String>(); 
         JSONObject lieucible = liste_lieux.getJSONObject(i); 
         map3.put("idlieu", lieucible.getString("idlieuxspirituels")); 
         map3.put("nomlieu", lieucible.getString("nom_lieux")); 
         map3.put("adresse", lieucible.getString("adresse_lieux")); 
         map3.put("img", LoadPicture.loadImageFromWebOperations(getString(R.string.URL_Images)+lieucible.getString("image"),"/sdcard/MysticWay/icon_lieu_"+lieucible.getString("idlieuxspirituels")+".jpg")); 
         listItem2.add(map3); 
        } 
       } 
       handler.sendEmptyMessage(0); 
       return; 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
       handler.sendEmptyMessage(1); 
       return; 
      } 
     } 
    })).start(); 
} 

private Handler handler = new Handler() { 
    public void handleMessage(android.os.Message msg) { 
     if(msg.what == 0) 
     { 
      // Si le transfert c'est bien exécuté 
      mProgressDialog.dismiss(); 
      Titre.setText(map.get("titre")); 
      Description.setText(Html.fromHtml(map.get("description"))); 
      Lien.setText(map.get("liens")); 
      note.setText(map.get("note_moyenne")); 
      if(nombre_de_lieux==1) 
      { 
       View_Fiche_Phenomene.this.liste_lieux.setText(nombre_de_lieux+" lieu est associé à ce phénomène."); 
       liste_lieux.setEnabled(true); 
      } 
      else if (nombre_de_lieux>1) 
      { 
       View_Fiche_Phenomene.this.liste_lieux.setText(nombre_de_lieux+" lieux sont associés à ce phénomène."); 
       liste_lieux.setEnabled(true); 
      } 

      Intent checkIntent = new Intent(); 
      checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
      startActivityForResult(checkIntent, 0); 
      if (map.get("img") == null) 
       Image.setImageResource(R.drawable.noimage); 
      else 
       Image.setImageDrawable(Drawable.createFromPath(map.get("img"))); 

      if(Float.parseFloat(map.get("note_moyenne"))== 5)//img 5 
       notemoyenne.setImageResource(R.drawable.etoile_5); 
      else if (Float.parseFloat(map.get("note_moyenne"))<5 && Float.parseFloat(map.get("note_moyenne")) > 4)//img 4.5 
       notemoyenne.setImageResource(R.drawable.etoile_4_5); 
      else if (Float.parseFloat(map.get("note_moyenne")) == 4)//img 4 
       notemoyenne.setImageResource(R.drawable.etoile_4); 
      else if (Float.parseFloat(map.get("note_moyenne"))<4 && Float.parseFloat(map.get("note_moyenne")) > 3)//img 3.5 
       notemoyenne.setImageResource(R.drawable.etoile_3_5); 
      else if (Float.parseFloat(map.get("note_moyenne")) == 3)//img 3 
       notemoyenne.setImageResource(R.drawable.etoile_3); 
      else if (Float.parseFloat(map.get("note_moyenne"))<3 && Float.parseFloat(map.get("note_moyenne")) > 2)//img 2.5 
       notemoyenne.setImageResource(R.drawable.etoile_2_5); 
      else if (Float.parseFloat(map.get("note_moyenne")) == 2)//img 2 
       notemoyenne.setImageResource(R.drawable.etoile_2); 
      else if (Float.parseFloat(map.get("note_moyenne"))<2 && Float.parseFloat(map.get("note_moyenne")) > 1)//img 1.5 
       notemoyenne.setImageResource(R.drawable.etoile_1_5); 
      else if (Float.parseFloat(map.get("note_moyenne")) == 1)//img 1 
       notemoyenne.setImageResource(R.drawable.etoile_1); 
      else if (Float.parseFloat(map.get("note_moyenne"))<1 && Float.parseFloat(map.get("note_moyenne")) > 0)//img 0.5 
       notemoyenne.setImageResource(R.drawable.etoile_0_5); 
      //sinon img 0 
     } 
     if(msg.what == 1) 
     { 
      // Erreur : réseau ou autre 
      mProgressDialog.dismiss(); 
      AlertDialog.Builder adb=new AlertDialog.Builder(mContext); 
      adb.setTitle("Erreur"); 
      adb.setMessage("Impossible de comuniquer avec le serveur!"); 
      adb.setPositiveButton("Ok", null); 
      adb.show(); 
     } 
    }; 
}; 

回答

1

使用Sqlite數據庫存儲結果是一個好主意。至於檢查數據是否已經改變,有幾種方法可以做到這一點 - 您可以在服務器端添加一個Last-Modified頭,其中可以包含結果上次更改的時間。如果最後修改時間與最後一次獲取JSON請求(您可以在Sqlite數據庫中進行檢查)的時間相同,則不需要下載請求的主體。

如果你不想跟蹤時間戳記(儘管這是最好的方法),你可以做的另一種方法是跟蹤MD5散列值或SHA1,或者是最不重要的資源。然後,您可以將哈希放在HTTP標頭中,如果哈希與您存儲在Sqlite數據庫中的哈希相匹配,則無需下載內容。這隻會對將要穿過網絡的大量JSON數據有用,因爲在服務器端執行加密(無論是在時間和資源方面)都有成本。

1

當你下載它,我會保存在SQLite數據庫中的數據。然後你可以操縱它你喜歡什麼,更新某些行等。

+0

好的謝謝,但我如何檢測如果json是更新或不? – Algodrill

+0

那麼這一切都取決於數據是什麼以及需要多久更新一次?我不知道一個簡單的方法來檢查它是否不同,而無需再次下載。你可以設置一個服務,每隔幾個小時或每天一次在後臺下載。 –

+0

使用Sqlite數據庫的好主意。 – ajacian81