Est-il possible d'ajouter un tableau ou un objet à SharedPreferences sur Android

J'ai un ArrayList des objets qui ont un nom et une icône de pointeur et je veux l'enregistrer dans SharedPreferences. Comment puis-je faire?

NOTE: Je ne veux pas utiliser Database

69
demandé sur CopsOnRoad 2010-10-07 00:40:34

9 réponses

Donc, à partir du site de développeur android sur Stockage de données :

Préférences Utilisateur

Les préférences partagées ne sont pas strictement destinées à enregistrer les "préférences de l'utilisateur", telles que la sonnerie choisie par l'utilisateur. Si vous souhaitez créer des préférences utilisateur pour votre application, consultez PreferenceActivity, qui fournit un cadre D'activité permettant de créer des préférences utilisateur, qui seront automatiquement conservées (à l'aide des préférences partagées).

Donc Je je pense que c'est correct car ce sont simplement des paires clé-valeur qui sont persistantes.

Pour l'affiche originale, ce n'est pas si difficile. Vous parcourez simplement votre liste de tableaux et ajoutez les éléments. Dans cet exemple, j'utilise une carte pour plus de simplicité, mais vous pouvez utiliser une liste de tableaux et la modifier de manière appropriée:

// 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()

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

Update: si vous utilisez L'API Niveau 11 ou version ultérieure, il y a un méthode pour écrire un jeu de Chaînes

56
répondu Noel 2012-10-19 17:53:31

Quel que soit le niveau de L'API, Vérifiez tableaux de chaînes et tableaux D'objets dans SharedPreferences


ENREGISTRER LE TABLEAU

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();  
} 

CHARGER LE TABLEAU

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;  
}  
69
répondu Sherif elKhatib 2012-05-30 12:09:43

Pour écrire,

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();

Comme Suit:

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();
}
55
répondu Rohit 2013-03-04 12:18:53

Préférences partagées introduit un getStringSet et putStringSet méthodes au niveau de L'API 11, mais ce n'est pas compatible avec les anciennes versions D'Android (qui sont encore populaires), et est également limitée à des ensembles de chaînes.

Android ne fournit pas de meilleures méthodes, et boucler sur des cartes et des tableaux pour les enregistrer et les charger n'est pas très facile et propre, spécialement pour les tableaux. 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 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();
        }
    }
}

Maintenant, vous pouvez enregistrer n'importe quelle collection dans les préférences partagées avec ceci cinq méthodes. Travailler avec JSONObject et JSONArray est très facile. Vous pouvez utiliser le constructeur public JSONArray (Collection copyFrom) pour créer un JSONArray à partir de N'importe quelle collection Java et utiliser les méthodes get de JSONArray pour accéder aux éléments.

Il n'y a pas de limite de taille pour les préférences partagées (en plus des limites de stockage de l'appareil), de sorte que ces méthodes peuvent fonctionner pour la plupart des cas habituels où vous voulez un stockage rapide et facile pour une collection dans votre application. Mais l'analyse JSON se produit ici, et les préférences dans Android sont stockées en tant que XMLS en interne, donc Je recommande d'utiliser d'autres mécanismes de stockage de données persistants lorsque vous traitez avec des mégaoctets de données.

30
répondu Mostafa 2011-12-15 07:08:01

Mode facile pour le stockage d'objets complexes avec l'utilisation de la bibliothèque google 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/

13
répondu Hpsaturn 2014-03-18 11:40:36

J'ai chargé un tableau de taille taille (déjà créé dans mon tableau.xml) dans mes préférences.fichier xml avec le code ci-dessous. @array / pant_inch_size est l'id du tableau entier.

 <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" /> 

Cela a rempli le menu avec des choix du tableau. J'ai défini la taille par défaut sur 34, donc lorsque le menu apparaît, ils voient que la taille 34 est pré-sélectionnée.

3
répondu Keith 2010-11-05 01:13:01

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

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

Stockez ensuite la chaîne dans les préférences partagées. Une fois que vous en avez besoin, il suffit d'obtenir une chaîne à partir des préférences partagées et de la convertir en JSONArray ou JSONObject(selon vos besoins.)

2
répondu Gaurav Darji 2015-01-05 07:10:10

Pour écrire:

 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();
}

Pour lire:

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;
}
1
répondu Benav 2015-05-03 00:10:03

C'est le code de préférences partagées que j'utilise avec succès, référez-vous à ce lien :

  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());


    }

   }

BON CODAGE!

1
répondu dondondon 2015-09-28 15:05:07