2012-05-01 10 views
1

私のアプリケーションでは、jsonに情報が含まれているURLを取得します。私は電話でこのjsonを保存したいと思いますし、電話がURLと同じかどうかはjsonを使いました。 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 DBをチェックインできる)と同じ場合、リクエストの本文をダウンロードする必要はありません。

タイムスタンプを記録したくない場合(これが最善の方法ですが)、MD5ハッシュやSHA1などのリソースを最小限に抑えることができます。次に、HTTPヘッダーにハッシュを入れ、ハッシュがSqliteデータベースに保存されているものと一致する場合は、コンテンツをダウンロードする必要はありません。これは、(時間とリソースの両方で)サーバー側で暗号化を行うコストがあるため、ネットワークを経由するJSONデータの量が多い場合にのみ役立ちます。

1

あなたがそれをダウンロードするとき、私はSqliteをDBにデータを保存します。次に、好きなように操作したり、特定の行を更新したりすることができます。

+0

ありがとうございます。しかし、jsonが更新されているかどうかはどうですか? – Algodrill

+0

これはデータの内容と更新頻度によって異なります。私はそれが異なっているかどうかを確認する簡単な方法を、それをもう一度ダウンロードすることなく知らない。数時間ごとに、または1日に1回、バックグラウンドでダウンロードするサービスを設定することができます –

+0

Sqlite DBの使用に関する良い考え方。 – ajacian81

関連する問題