我有一些带有一些片段的活动,并且必须保留一些相当数量的数据但对SQL不够公平。现在使用SharedPreferences的最佳做法是什么?我想尽可能避免调用文件和提交它。因为我假设解析该文件,特别是提交对性能不利。
我知道这个question,它表示对SharedPreferences文件的调用总是返回相同的对象。但是提交呢?
我应该使用f.e.一个Bundle来保存我的数据并在Activity在后台运行时立即保存它们?或者我应该像在每个片段中一样持续保留一部分数据吗?或者我只是在追捕幽灵?
答案 0 :(得分:3)
我认为这是一种不必要且过早的优化,实际上不会对性能产生任何影响。您在SharedPreferences中存储了多少数据?我想你只是在追捕鬼魂。
如果您将它用作片段之间的通信方式,那么您将其用于非预期目的。
编辑:对于进一步的评估,SharedPreferences基本上将事物存储在键/值映射中。这使得存储和检索诸如用户首选项(因此名称)之类的简单事物非常方便。如果你需要做更复杂的事情,你可以很快看到使用Key / Value映射会变得多么麻烦,这就是为什么移动到像SQLite这样的数据库存储是有意义的。使用数据库,您可以获得使用查询的明显好处。基本上,SharedPreferences的重点是为开发人员增加了便利性,因此您无需创建完整的数据库来存储简单的值。请点击此处了解更多信息:
答案 1 :(得分:2)
不确定“合理数量的数据”到底是什么,但使用SQL - 这就是它的原因。我真的没有理由不这样做,知道它真的很容易。如果你从来没有在android上尝试sqlite(这可以解释你为什么要试图避免它:)然后通过初级教程,你就完成了。
答案 2 :(得分:0)
您可以使用公共课程,我们必须在需要时调用它。
示例:
SessionManager mSessionManager = new SessionManager(this);
mSessionManager.putStringData("key", "value");
课程如下:
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
public class SessionManager {
// Shared Preferences
SharedPreferences pref;
// Editor for Shared preferences
Editor editor;
// Context
Context _context;
// Shared pref mode
int MODE_MULTI_PROCESS = 0;
// Sharedpref file name
private static final String PREF_NAME = "SharedPref_Name";
private SharedPreferences getPref() {
return _context.getSharedPreferences(PREF_NAME, Context.MODE_MULTI_PROCESS);
}
// Constructor
public SessionManager(Context context) {
this._context = context;
pref = _context.getSharedPreferences(PREF_NAME, MODE_MULTI_PROCESS);
editor = pref.edit();
}
/**
* Set the String data in the preferences.
*/
public void putStringData(String keyname, String value) {
editor.putString(keyname, value);
editor.commit();
}
/**
* @return the string data from the prefs
*/
public String getStringData(String keyName) {
return pref.getString(keyName, "");
}
/**
* Set the int data in the preferences.
*/
public void putIntData(String keyname, int value) {
editor.putInt(keyname, value);
editor.commit();
}
/**
* @return the boolean data from the prefs
*/
public int getIntData(String keyName) {
return pref.getInt(keyName, 0);
}
/**
* Set the boolean data in the preferences.
*/
public void putBooleanData(String keyname, boolean value) {
editor.putBoolean(keyname, value);
editor.commit();
}
/**
* @return the boolean data from the prefs
*/
public boolean getBooleanData(String keyName) {
return pref.getBoolean(keyName, false);
}
/**
* Set the long data in the preferences.
*/
public void putLongData(String keyname, long value) {
editor.putLong(keyname, value);
editor.commit();
}
/**
* @return the long data from the prefs
*/
public long getLongData(String keyName) {
return pref.getLong(keyName, 99);
}
/**
* remove data from pref
*
* @param keyName
*/
public void removeData(String keyName) {
editor.remove(keyName);
editor.commit();
}
//Save arrayList of Model type
public void saveAssignedLocationsToSharedPrefs(List<Locations> LocationModel) {
Gson gson = new Gson();
String jsonLocation = gson.toJson(LocationModel);
editor.putString("LocationArray", jsonLocation);
editor.commit();
}
//get arrayList of Model type
public ArrayList<Locations> getAssignedLocationsFromSharedPrefs() {
List<Locations> LocationData;
String jsonLocation = pref.getString("LocationArray", null);
Gson gson = new Gson();
Locations[] LocationItems = gson.fromJson(jsonLocation,
Locations[].class);
LocationData = Arrays.asList(LocationItems);
LocationData = new ArrayList<Locations>(LocationData);
return (ArrayList<Locations>) LocationData;
}
}