是否可以在Android上向SharedPreferences添加数组或对象

如果没有,是否有任何解决方法? 我有一个具有名称和图标指针的对象的数组列表。 我不想使用数据库。

所以从数据存储上的android开发者站点:

用户首选项

共享偏好不是严格保存“用户偏好”,比如用户select的铃声。 如果您有兴趣为您的应用程序创build用户首选项,请参阅PreferenceActivity,它提供了一个用于创build用户首选项的Activity框架,该用户首选项将自动保留(使用共享首选项)。

所以我认为这是可以的,因为它只是简单的键值对而已。

对于原来的海报来说,这并不难。 您只需遍历数组列表并添加项目即可。 在这个例子中,为了简单起见,我使用了一个map,但是你可以使用一个数组列表来适当地改变它:

// my list of names, icon locations Map<String, String> nameIcons = new HashMap<String, String>(); nameIcons.put("Noel", "/location/to/noel/icon.png"); nameIcons.put("Bob", "another/location/to/bob/icon.png"); nameIcons.put("another name", "last/location/icon.png"); SharedPreferences keyValues = getContext().getSharedPreferences("name_icons_list", Context.MODE_PRIVATE); SharedPreferences.Editor keyValuesEditor = keyValues.edit(); for (String s : nameIcons.keySet()) { // use the name as the key, and the icon as the value keyValuesEditor.putString(s, nameIcons.get(s)); } keyValuesEditor.commit() 

你会做类似的事情,再次读取键值对。 让我知道这个是否奏效。

更新:如果您使用API​​级别11或更高版本,则有一种方法可以写出一个string集

无论API级别如何,请在SharedPreferences中检查string数组和对象数组


保存arrays

 public boolean saveArray(String[] array, String arrayName, Context mContext) { SharedPreferences prefs = mContext.getSharedPreferences("preferencename", 0); SharedPreferences.Editor editor = prefs.edit(); editor.putInt(arrayName +"_size", array.length); for(int i=0;i<array.length;i++) editor.putString(arrayName + "_" + i, array[i]); return editor.commit(); } 

加载arrays

 public String[] loadArray(String arrayName, Context mContext) { SharedPreferences prefs = mContext.getSharedPreferences("preferencename", 0); int size = prefs.getInt(arrayName + "_size", 0); String array[] = new String[size]; for(int i=0;i<size;i++) array[i] = prefs.getString(arrayName + "_" + i, null); return array; } 

来写,

 SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(this); JSONArray jsonArray = new JSONArray(); jsonArray.put(1); jsonArray.put(2); Editor editor = prefs.edit(); editor.putString("key", jsonArray.toString()); System.out.println(jsonArray.toString()); editor.commit(); 

读书,

 try { JSONArray jsonArray2 = new JSONArray(prefs.getString("key", "[]")); for (int i = 0; i < jsonArray2.length(); i++) { Log.d("your JSON Array", jsonArray2.getInt(i)+""); } } catch (Exception e) { e.printStackTrace(); } 

共享首选项在API级别11中引入了getStringSetputStringSet方法,但是这与旧版本的Android(仍然很stream行)不兼容,并且仅限于string集合。

Android不提供更好的方法,并且循环遍历映射和数组来保存和加载它们并不是很容易和干净,特别是对于数组。 但更好的实施并不难:

 package com.example.utils; import org.json.JSONObject; import org.json.JSONArray; import org.json.JSONException; import android.content.Context; import android.content.SharedPreferences; public class JSONSharedPreferences { private static final String PREFIX = "json"; public static void saveJSONObject(Context c, String prefName, String key, JSONObject object) { SharedPreferences settings = c.getSharedPreferences(prefName, 0); SharedPreferences.Editor editor = settings.edit(); editor.putString(JSONSharedPreferences.PREFIX+key, object.toString()); editor.commit(); } public static void saveJSONArray(Context c, String prefName, String key, JSONArray array) { SharedPreferences settings = c.getSharedPreferences(prefName, 0); SharedPreferences.Editor editor = settings.edit(); editor.putString(JSONSharedPreferences.PREFIX+key, array.toString()); editor.commit(); } public static JSONObject loadJSONObject(Context c, String prefName, String key) throws JSONException { SharedPreferences settings = c.getSharedPreferences(prefName, 0); return new JSONObject(settings.getString(JSONSharedPreferences.PREFIX+key, "{}")); } public static JSONArray loadJSONArray(Context c, String prefName, String key) throws JSONException { SharedPreferences settings = c.getSharedPreferences(prefName, 0); return new JSONArray(settings.getString(JSONSharedPreferences.PREFIX+key, "[]")); } public static void remove(Context c, String prefName, String key) { SharedPreferences settings = c.getSharedPreferences(prefName, 0); if (settings.contains(JSONSharedPreferences.PREFIX+key)) { SharedPreferences.Editor editor = settings.edit(); editor.remove(JSONSharedPreferences.PREFIX+key); editor.commit(); } } } 

现在,您可以使用这五种方法保存共享首选项中的任何集合。 使用JSONObjectJSONArray非常简单。 您可以使用JSONArray (Collection copyFrom)公共构造函数将JSONArray从任何Java集合中取出,并使用JSONArrayget方法来访问元素。

共享首选项没有大小限制(除了设备的存储限制),所以这些方法可以适用于大多数情况下,你想在你的应用程序中快速和容易地存储一些集合。 但是JSONparsing发生在这里,Android中的首选项在内部被存储为XML,所以我build议在处理兆字节数据时使用其他持久数据存储机制。

使用Gson谷歌图书馆的复杂对象存储的简单模式[1]

 public static void setComplexObject(Context ctx, ComplexObject obj){ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(ctx); SharedPreferences.Editor editor = preferences.edit(); editor.putString("COMPLEX_OBJECT",new Gson().toJson(obj)); editor.commit(); } public static ComplexObject getComplexObject (Context ctx){ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(ctx); String sobj = preferences.getString("COMPLEX_OBJECT", ""); if(sobj.equals(""))return null; else return new Gson().fromJson(sobj, ComplexObject.class); } 

[1] http://code.google.com/p/google-gson/

我用下面的代码加载了一个腰围数组(已经在我的array.xml中创build)到我的preferences.xml文件中。 @ array / pant_inch_size是整个数组的ID。

  <ListPreference android:title="choosepantsize" android:summary="Choose Pant Size" android:key="pantSizePref" android:defaultValue="34" android:entries="@array/pant_inch_size" android:entryValues="@array/pant_inch_size" /> 

这使用数组中的选项填充菜单。 我将默认大小设置为34,所以当popup菜单时,他们看到大小34是预先选定的。

简单的方法是,将其转换为JSONstring,如下所示:

 Gson gson = new Gson(); String json = gson.toJson(myObj); 

然后将string存储在共享首选项中。 一旦你需要它只是从共享首选项获取string,并转换回JSONArray或JSONObject(根据您的要求)。

写作:

  private <T> void storeData(String key, T data) { ByteArrayOutputStream serializedData = new ByteArrayOutputStream(); try { ObjectOutputStream serializer = new ObjectOutputStream(serializedData); serializer.writeObject(data); } catch (IOException e) { e.printStackTrace(); } SharedPreferences sharedPreferences = getSharedPreferences(TAG, 0); SharedPreferences.Editor edit = sharedPreferences.edit(); edit.putString(key, Base64.encodeToString(serializedData.toByteArray(), Base64.DEFAULT)); edit.commit(); } 

阅读:

 private <T> T getStoredData(String key) { SharedPreferences sharedPreferences = getSharedPreferences(TAG, 0); String serializedData = sharedPreferences.getString(key, null); T storedData = null; try { ByteArrayInputStream input = new ByteArrayInputStream(Base64.decode(serializedData, Base64.DEFAULT)); ObjectInputStream inputStream = new ObjectInputStream(input); storedData = (T)inputStream.readObject(); } catch (IOException|ClassNotFoundException|java.lang.IllegalArgumentException e) { e.printStackTrace(); } return storedData; } 

这是我成功使用的共享首选项代码,请参阅此链接 :

  public class MainActivity extends Activity { private static final int RESULT_SETTINGS = 1; Button button; public String a="dd"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); button = (Button) findViewById(R.id.btnoptions); setContentView(R.layout.activity_main); // showUserSettings(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.settings, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_settings: Intent i = new Intent(this, UserSettingActivity.class); startActivityForResult(i, RESULT_SETTINGS); break; } return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case RESULT_SETTINGS: showUserSettings(); break; } } private void showUserSettings() { SharedPreferences sharedPrefs = PreferenceManager .getDefaultSharedPreferences(this); StringBuilder builder = new StringBuilder(); builder.append("\n Pet: " + sharedPrefs.getString("prefpetname", "NULL")); builder.append("\n Address:" + sharedPrefs.getString("prefaddress","NULL" )); builder.append("\n Your name: " + sharedPrefs.getString("prefname", "NULL")); TextView settingsTextView = (TextView) findViewById(R.id.textUserSettings); settingsTextView.setText(builder.toString()); } } 

快乐编码!