1

在我的应用程序中,我得到一个包含信息的 json url。我想将此json保存在手机中,然后使用json是否手机与url相同。如果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();
        }
    };
};
4

2 回答 2

1

当您下载数据时,我会将数据保存在 Sqlite 数据库中。然后你可以随心所欲地操作它,更新某些行等。

于 2012-05-01T16:28:14.697 回答
1

使用 Sqlite 数据库存储结果是一个好主意。至于检查数据是否已更改,有几种方法可以做到 - 您可以在服务器端添加 Last-Modified 标头,其中可以包含结果上次更改的时间。如果 Last-Modified 时间与您上次收到 JSON 请求的时间相同(您可以在 Sqlite DB 中检查),则无需下载请求正文。

如果您不想跟踪时间戳(尽管这是最好的方法),另一种方法是跟踪 MD5 哈希或 SHA1 或任何资源最少的东西。然后,您可以将哈希放在 HTTP 标头中,如果哈希与您存储在 Sqlite 数据库中的内容匹配,则无需下载内容。这仅对将通过网络传输的大量 JSON 数据有用,因为在服务器端进行加密是有成本的(在时间和资源方面)。

于 2012-05-28T15:29:28.730 回答