Est-il possible d’append un tableau ou un object à SharedPreferences sur Android

J’ai un ArrayList d’objects qui ont un nom et un pointeur d’icône et je veux l’enregistrer dans SharedPreferences . Comment puis-je faire?

NOTE: Je ne veux pas utiliser de firebase database

Donc, du site de développement Android sur le stockage de données :

Préférences de l’utilisateur

Les préférences partagées ne sont pas ssortingctement destinées à enregistrer les “préférences utilisateur”, telles que la sonnerie choisie par l’utilisateur. Si vous souhaitez créer des préférences utilisateur pour votre application, voir PreferenceActivity, qui fournit un cadre d’activité pour créer des préférences utilisateur, qui seront automatiquement conservées (en utilisant les préférences partagées).

Donc, je pense que c’est correct puisque ce sont simplement des paires clé-valeur qui sont conservées.

Pour l’affiche originale, ce n’est pas si difficile. Il vous suffit de parcourir votre liste de tableaux et d’append les éléments. Dans cet exemple, j’utilise une carte pour simplifier, mais vous pouvez utiliser une liste de tableaux et la modifier de manière appropriée:

 // my list of names, icon locations Map nameIcons = new HashMap(); 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 (Ssortingng s : nameIcons.keySet()) { // use the name as the key, and the icon as the value keyValuesEditor.putSsortingng(s, nameIcons.get(s)); } keyValuesEditor.commit() 

Vous feriez quelque chose de similaire pour lire à nouveau les paires clé-valeur. Laissez-moi savoir si cela fonctionne.

Mise à jour: Si vous utilisez l’API niveau 11 ou supérieur, il existe une méthode pour écrire un ensemble de chaînes

Quel que soit le niveau de l’API, vérifiez les tableaux de chaînes et les tableaux d’objects dans SharedPreferences


SAVE ARRAY

 public boolean saveArray(Ssortingng[] array, Ssortingng 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 

Tableau de charge

 public Ssortingng[] loadArray(Ssortingng arrayName, Context mContext) { SharedPreferences prefs = mContext.getSharedPreferences("preferencename", 0); int size = prefs.getInt(arrayName + "_size", 0); Ssortingng array[] = new Ssortingng[size]; for(int i=0;i 

Écrire,

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

Lire,

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

Les préférences partagées ont introduit des méthodes getSsortingngSet et putSsortingngSet dans l’API Level 11, mais ce n’est pas compatible avec les anciennes versions d’Android (qui sont toujours populaires), et se limite également aux ensembles de chaînes.

Android ne fournit pas de meilleures méthodes, et passer en boucle sur les cartes et les tableaux pour les sauvegarder et les charger n’est pas très simple et propre, en particulier pour les baies. Mais une meilleure implémentation n’est pas si difficile:

 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 Ssortingng PREFIX = "json"; public static void saveJSONObject(Context c, Ssortingng prefName, Ssortingng key, JSONObject object) { SharedPreferences settings = c.getSharedPreferences(prefName, 0); SharedPreferences.Editor editor = settings.edit(); editor.putSsortingng(JSONSharedPreferences.PREFIX+key, object.toSsortingng()); editor.commit(); } public static void saveJSONArray(Context c, Ssortingng prefName, Ssortingng key, JSONArray array) { SharedPreferences settings = c.getSharedPreferences(prefName, 0); SharedPreferences.Editor editor = settings.edit(); editor.putSsortingng(JSONSharedPreferences.PREFIX+key, array.toSsortingng()); editor.commit(); } public static JSONObject loadJSONObject(Context c, Ssortingng prefName, Ssortingng key) throws JSONException { SharedPreferences settings = c.getSharedPreferences(prefName, 0); return new JSONObject(settings.getSsortingng(JSONSharedPreferences.PREFIX+key, "{}")); } public static JSONArray loadJSONArray(Context c, Ssortingng prefName, Ssortingng key) throws JSONException { SharedPreferences settings = c.getSharedPreferences(prefName, 0); return new JSONArray(settings.getSsortingng(JSONSharedPreferences.PREFIX+key, "[]")); } public static void remove(Context c, Ssortingng prefName, Ssortingng 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(); } } } 

Vous pouvez maintenant enregistrer n’importe quelle collection dans les préférences partagées avec ces cinq méthodes. Travailler avec JSONObject et JSONArray est très simple. Vous pouvez utiliser le constructeur public JSONArray (Collection copyFrom) pour créer un JSONArray partir de toute collection Java et utiliser les méthodes get JSONArray pour accéder aux éléments.

Il n’y a pas de limite de taille pour les préférences partagées (à part les limites de stockage du périphérique), ces méthodes peuvent donc fonctionner dans la plupart des cas habituels où vous souhaitez un stockage simple et rapide de certaines collections dans votre application. Mais l’parsing syntaxique JSON se produit ici, et les préférences d’Android sont stockées en tant que fichiers XML en interne. Je vous recommande donc d’utiliser d’autres mécanismes de stockage de données persistants lorsque vous traitez des mégaoctets de données.

Mode facile pour le stockage d’objects complexes avec Gson google library [1]

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

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

J’ai chargé un tableau de tailles de taille (déjà créé dans mon array.xml) dans mon fichier preferences.xml avec le code ci-dessous. @ array / pant_inch_size est l’id de l’ensemble du tableau.

   

Cela a rempli le menu avec des choix du tableau. Je définis la taille par défaut à 34, donc quand le menu apparaît, ils voient la taille 34 est présélectionnée.

Le moyen simple est de le convertir en chaîne JSON comme ci-dessous:

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

Ensuite, stockez la chaîne dans les préférences partagées. Une fois que vous en avez besoin, obtenez simplement la chaîne des préférences partagées et reconvertissez-la en JSONArray ou JSONObject (selon vos besoins).

Pour écrire:

  private  void storeData(Ssortingng 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.putSsortingng(key, Base64.encodeToSsortingng(serializedData.toByteArray(), Base64.DEFAULT)); edit.commit(); } 

A lire:

 private  T getStoredData(Ssortingng key) { SharedPreferences sharedPreferences = getSharedPreferences(TAG, 0); Ssortingng serializedData = sharedPreferences.getSsortingng(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; } 

Ceci est le code de préférences partagé que j’utilise avec succès, référence ce lien :

  public class MainActivity extends Activity { private static final int RESULT_SETTINGS = 1; Button button; public Ssortingng 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); SsortingngBuilder builder = new SsortingngBuilder(); builder.append("\n Pet: " + sharedPrefs.getSsortingng("prefpetname", "NULL")); builder.append("\n Address:" + sharedPrefs.getSsortingng("prefaddress","NULL" )); builder.append("\n Your name: " + sharedPrefs.getSsortingng("prefname", "NULL")); TextView settingsTextView = (TextView) findViewById(R.id.textUserSettings); settingsTextView.setText(builder.toSsortingng()); } } 

HAPPY CODING!