在我的项目中,有一种情况我将Json数据作为设备在线时的响应。当设备离线时,我需要相同的数据。
我尝试使用
将数据保存到Default SharedPreference文件中PreferenceManager.getDefaultSharedPreferences(context).edit().putString("contactobject", result.toString()).apply();
从SharedPreference文件中检索数据,如使用
String result = PreferenceManager.getDefaultSharedPreferences(context).getString("contactobject", "");
问题是,通过使用SharedPreference,内存的使用率很高。
问题:还有其他更好的方法可以将数据保存在Cache内存中,就像WebView一样,以获得更好的性能。
答案 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的数据库。严重。