web-dev-qa-db-fra.com

Android ArrayList d'objets personnalisés - Enregistrer dans les préférences partagées - Sérialisable?

J'ai un ArrayList d'un objet. L'objet contient les types 'Bitmap' et 'String', puis seulement des accesseurs et des setters pour les deux. Tout d'abord, Bitmap est-il sérialisable?

Comment ferais-je pour sérialiser ceci afin de le stocker dans SharedPreferences? J'ai vu beaucoup de gens poser une question similaire mais aucune ne semble donner une bonne réponse. Je préférerais quelques exemples de code si possible.

Si bitmap n'est pas sérialisable, comment puis-je stocker cet ArrayList?

merci beaucoup.

66
Paul Blundell

Oui, vous pouvez enregistrer votre objet composite dans les préférences partagées. Disons..

 Student mStudentObject = new Student();
 SharedPreferences appSharedPrefs = PreferenceManager
             .getDefaultSharedPreferences(this.getApplicationContext());
 Editor prefsEditor = appSharedPrefs.edit();
 Gson gson = new Gson();
 String json = gson.toJson(mStudentObject);
 prefsEditor.putString("MyObject", json);
 prefsEditor.commit(); 

..et maintenant vous pouvez récupérer votre objet en tant que:

 SharedPreferences appSharedPrefs = PreferenceManager
             .getDefaultSharedPreferences(this.getApplicationContext());
 Gson gson = new Gson();
 String json = appSharedPrefs.getString("MyObject", "");
 Student mStudentObject = gson.fromJson(json, Student.class);

Pour plus d'informations, cliquez ici.

Si vous souhaitez récupérer une ArrayList d'un objet de type, par exemple. Student, puis utilisez:

Type type = new TypeToken<List<Student>>(){}.getType();
List<Student> students = gson.fromJson(json, type);
122
Mohammad Imran

La réponse ci-dessus fonctionne, mais pas pour la liste:

Pour enregistrer une liste d'objets, procédez comme suit:

List<Cars> cars= new ArrayList<Cars>();
    cars.add(a);
    cars.add(b);
    cars.add(c);
    cars.add(d);

    gson = new Gson();
    String jsonCars = gson.toJson(cars);
    Log.d("TAG","jsonCars = " + jsonCars);

Lire l'objet json:

Type type = new TypeToken<List<Cars>>(){}.getType();
List<Cars> carsList = gson.fromJson(jsonCars, type);
109
SpyZip

Pour moi cela a fonctionné comme ceci: 

Mettez des valeurs dans SharedPreferances: 

String key = "Key";
ArrayList<ModelClass> ModelArrayList=new ArrayList();

SharedPreferences shref;
SharedPreferences.Editor editor;
shref = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

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

editor = shref.edit();
editor.remove(key).commit();
editor.putString(key, json);
editor.commit();

Pour obtenir des valeurs de SharedPreferances: 

Gson gson = new Gson();
String response=shref.getString(key , "");
ArrayList<ModelClass> lstArrayList = gson.fromJson(response, 
    new TypeToken<List<ModelClass>>(){}.getType());
19
Apurva Kolapkar

Pour économiser:

public static void saveSharedPreferencesLogList(Context context, List<PhoneCallLog> callLog) {
    SharedPreferences mPrefs = context.getSharedPreferences(Constant.CALL_HISTORY_RC, context.MODE_PRIVATE);
    SharedPreferences.Editor prefsEditor = mPrefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(callLog);
    prefsEditor.putString("myJson", json);
    prefsEditor.commit();
}

Pour charge:

public static List<PhoneCallLog> loadSharedPreferencesLogList(Context context) {
    List<PhoneCallLog> callLog = new ArrayList<PhoneCallLog>();
    SharedPreferences mPrefs = context.getSharedPreferences(Constant.CALL_HISTORY_RC, context.MODE_PRIVATE);
    Gson gson = new Gson();
    String json = mPrefs.getString("myJson", "");
    if (json.isEmpty()) {
        callLog = new ArrayList<PhoneCallLog>();
    } else {
        Type type = new TypeToken<List<PhoneCallLog>>() {
        }.getType();
        callLog = gson.fromJson(json, type);
    }
    return callLog;
}

PhoneCallLog est le nom de mon objet personnalisé. (Contient les valeurs String, long et boolean)

12
Mete

## Pour un appel unique et la récupération de votre liste, utilisez ## `List models = new ArrayList <> ();

Gson gson = new Gson();

String value= gson.toJson(models);

PreferenceManager.getDefaultSharedPreferences(context).edit().putString(value, "StringValueToRetrieve").apply();

Pour récupérer la liste, procédez comme suit:

 String value=PreferenceManager.getDefaultSharedPreferences(context).getString("StringValueToRetrieve", "noValue");

if(!value.contains("noValue")){

Gson gson = new Gson();

List<Model> models= gson.fromJson(value, 
    new TypeToken<List<Model>>(){}.getType());
}
`
0
AGUDA JOHN

Supposons que vous ayez une classe appelée Medication. Vous pouvez utiliser les fonctions suivantes:

public static void saveMedicineToList(Medication medication){
            ArrayList<Medication> medicationArrayList = getListOfMedication();
            if(medicationArrayList == null) medicationArrayList = new ArrayList<>();
            medicationArrayList.add(medication);
            saveListOfMedicine(medicationArrayList);
        }

    public static void saveListOfMedicine(ArrayList<Medication> medicationArrayList){
        SharedPreferences shref;
        SharedPreferences.Editor editor;
        shref = PreferenceManager.getDefaultSharedPreferences(SakshamApp.getInstance());

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

        editor = shref.edit();
        editor.remove(KEY_MIDICINES_LIST).commit();
        editor.putString(KEY_MIDICINES_LIST, json);
        editor.commit();
    }

    public static ArrayList<Medication> getListOfMedication(){
        SharedPreferences shref = PreferenceManager.getDefaultSharedPreferences(SakshamApp.getInstance());
        Gson gson = new Gson();
        String response=shref.getString(KEY_MIDICINES_LIST , "");
        ArrayList<Medication> medicationArrayList = gson.fromJson(response,
                new TypeToken<List<Medication>>(){}.getType());
        return medicationArrayList;
    }
0
Abhishek Kumar

L'exemple de Mete ci-dessus a fonctionné à merveille.
Voici un exemple Kotlin

private var prefs: SharedPreferences = context?.getSharedPreferences("sharedPrefs", MODE_PRIVATE)
    ?: error("err")
private val gson = Gson()

enregistrer

fun saveObjectToArrayList(yourObject: YourObject) {
    val bookmarks = fetchArrayList()
    bookmarks.add(0, yourObject)
    val prefsEditor = prefs.edit()

    val json = gson.toJson(bookmarks)
    prefsEditor.putString("your_key", json)
    prefsEditor.apply()
}

lis

fun fetchArrayList(): ArrayList<YourObject> {
    val yourArrayList: ArrayList<YourObject>
    val json = prefs.getString("your_key", "")

    yourArrayList = when {
        json.isNullOrEmpty() -> ArrayList()
        else -> gson.fromJson(json, object : TypeToken<List<Feed>>() {}.type)
    }

    return yourArrayList
}
0
r3dm4n

Écrivez un code dans vos préférences partagées:  

public class MySharedPrefernce {

        private Context context;
        private String PREF_NAME = "UserPreference";
        private int PRIVATE_MODE = 0;
        private SharedPreferences preferences;
        private SharedPreferences.Editor editor;
        private DataKey = "CART_RESTAURANTS";

        //constructor
        public MySharedPrefernce(Context context) {
            this.context = context;
            this.preferences = context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
            editor = preferences.edit();
        }

        //add data
        public void saveRestaurantToSharedPrefs(List<CartRestaurantModel> cartRestaurantModel) {
            Gson gson = new Gson();
            String jsonCart = gson.toJson(cartRestaurantModel);
            editor.putString(DataKey, jsonCart);
            editor.commit();
        }

        //get data
        public ArrayList<CartRestaurantModel> getRestaurantToSharedPrefs() {
            List<CartRestaurantModel> cartData;
            if (preferences.contains(DataKey)) {
                String jsonCart = preferences.getString(DataKey, null);
                Gson gson = new Gson();
                CartRestaurantModel[] cartItems = gson.fromJson(jsonCart,
                        CartRestaurantModel[].class);

                cartData = Arrays.asList(cartItems);
                cartData = new ArrayList<CartRestaurantModel>(cartData);
            } else {
                try {
                    return new ArrayList<CartRestaurantModel>();
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }
            return (ArrayList<CartRestaurantModel>) cartData;
        }

        //clear data
        public void clearRestaurantSharedPrefsData() {
            editor.clear();
            editor.commit();
        }
}

Écrivez un code dans votre activité/fragment pour stocker et récupérer:

public List<CartRestaurantModel> cartRestaurantModel = new ArrayList<CartRestaurantModel>();  // to maintain restaurant for cart menus

Ranger :

new MySharedPrefernce(this).saveRestaurantToSharedPrefs(cartRestaurantModel);

À récupérer :

cartRestaurantModel = new MySharedPrefernce(this).getRestaurantToSharedPrefs();
0
SWAPDROiD