2012-05-01 96 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