Android在本地存储数据以供离线访问

时间:2016-02-20 05:23:02

标签: android performance

在我的项目中,有一种情况我将Json数据作为设备在线时的响应。当设备离线时,我需要相同的数据。

我尝试使用

将数据保存到Default SharedPreference文件中
PreferenceManager.getDefaultSharedPreferences(context).edit().putString("contactobject", result.toString()).apply();

从SharedPreference文件中检索数据,如使用

String result = PreferenceManager.getDefaultSharedPreferences(context).getString("contactobject", "");

问题是,通过使用SharedPreference,内存的使用率很高。

问题:还有其他更好的方法可以将数据保存在Cache内存中,就像WebView一样,以获得更好的性能。

2 个答案:

答案 0 :(得分:3)

Sharedpreferences使用键值。这可能会在一段时间内产生问题。因此,将数据存储在数据库中,并在用户离线时检索它。

<强>更新 您可以使用数据库来检索这样的记录

 aQuery.progress(progressDialog).ajax(url, JSONObject.class, new AjaxCallback<JSONObject>() {
    @Override
    public void callback(String url, JSONObject object, AjaxStatus status) {

        if (object != null) {
            //delete old records
            db.execSQL("delete from entrys");
            String quotos = object.optString("quote_data");
            String msg = object.optString("msg");
            //  Toast.makeText(getApplicationContext(),msg+" and "+quotos,Toast.LENGTH_LONG).show();

            try {
                JSONArray jsonArray = new JSONArray(quotos);
                al = new ArrayList<String>();
                for (int i = 0; i < jsonArray.length(); i++) {
                    jsonObject = jsonArray.getJSONObject(i);
                    String str = jsonObject.getString("quote");
                    al.add(str);

                    //add the data in database
                    ContentValues cv = new ContentValues();
                    cv.put("name",str);
                    db.insert("entrys",null,cv);
                    Log.d("STR,","Created"+str);
                }
                ArrayAdapter<String> adpt = new ArrayAdapter<String>(Wishes.this, R.layout.single_row, R.id.tv_wishdata, al);
                lv.setAdapter(adpt);

            } catch (JSONException e) {
                Toast.makeText(getApplicationContext(), "Server is busy Reciving data..", Toast.LENGTH_LONG).show();
            }

        } else {
            //show the data when user is offline
            SimpleCursorAdapter sd = new SimpleCursorAdapter(getApplicationContext(), R.layout.single_row,c, new String[]{"name"}, new int[]{R.id.tv_wishdata});
            lv.setAdapter(sd);

            Toast.makeText(getApplicationContext(), "Please Check Internet connection", Toast.LENGTH_LONG).show();
        }
    }
});

选项2 您还可以使用缓存文件来检索数据。 首先创建一个在cachefile中保存数据的函数。

public  void saveMyData()
{
    try {
        ObjectOutput out = new ObjectOutputStream(new FileOutputStream(new File(getFilesDir(),"")+"cachefile.txt"));
        out.writeObject(al.toString());
        Toast.makeText(getApplicationContext(), "Data Saved..",Toast.LENGTH_LONG).show();
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

然后在您从文件中显示数据时检索数据。

  private String retriveMyData()
{
    String fileContent = "";
    try {
        String currentLine;
        BufferedReader bufferedReader;
        FileInputStream fileInputStream = new FileInputStream(getFilesDir()+"cachefile.txt");
        bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream,"UTF-8"));


        while ((currentLine = bufferedReader.readLine()) != null) {
            fileContent += currentLine + '\n';
        }

        bufferedReader.close();
    } catch (IOException e) {
        e.printStackTrace();

        Log.d("FAILED","THOS IS NULL");
        fileContent = null;
    }
    Log.d("SUCESS","SUCESS BUDDYY"+fileContent);
    Toast.makeText(getApplicationContext(),fileContent+"",Toast.LENGTH_SHORT).show();
    return fileContent;

}

答案 1 :(得分:3)

只需将JSON写入缓存目录即可。如果您处于离线状态,请从缓存文件中读取它,并在联机时更新缓存。您不需要简单JSON的数据库。严重。