memorizzare e recuperare un oggetto di classe in comune predilezione

In Android possiamo memorizzare un oggetto di una classe in comune predilezione e recuperare l’oggetto più tardi?

Se è possibile come fare? Se non è possibile, quali sono le altre possibilità di farlo?

So che la serializzazione è un’opzione, ma sto cercando la possibilità di utilizzo condiviso di preferenza.

InformationsquelleAutor androidGuy | 2011-03-24

 

12 Replies
  1. 14

    Non è possibile.

    È possibile memorizzare solo, valori semplici in SharedPrefences SharePreferences.Editor

    Che, soprattutto, della classe si deve risparmiare?

    • Grazie.Voglio memorizzare alcuni dati membri della classe.E non voglio per memorizzare i valori dei membri di dati che utilizzano di preferenza.Voglio conservarla come un oggetto.Se non è condiviso preferenza quali sono le altre opzioni?
    • Serialise memorizzate in un database (SQLite) / in un file flat.
    • La risposta non è completa. La soluzione possibile è quella di trasformare il pojo in ByteArrayOutPutStream e salvare come Stringa nel SharedPreferences
    • un’altra opzione è salvato come json e poi la mappa indietro. Con EDILETTO o jackSON è davvero facile
    • Siamo in grado di serializzare l’oggetto e archivio condiviso di Preferenza.
    • Perché questo è contrassegnato come risposta corretta? Quelli di dare una soluzione vera e propria, questo dice solo “NO”…
    • mi permetta di ottenere la mia macchina del tempo indietro al 2011 e a capire che fuori
    • È possibile utilizzare questa libreria che ha molti nei feautres integrato. github.com/moinkhan-in/PreferenceSpider
    • Perché questa è la risposta corretta alla domanda originale. Alexander ha detto che lui già sapeva che in grado di serializzare un oggetto e quindi di memorizzare una stringa nelle preferenze. Beh, se prima di trasformare un oggetto JSON, binario o un altro formato di stringa, utilizzando probabilmente un 3rd party biblioteca, si può fare. Ma non è lo stesso come se l’API di Android avrebbe offerto una qualche possibilità di memorizzare un oggetto.

  2. 318

    Sì, si può fare questo usando Ediletto

    Scaricare il codice di Lavoro da GitHub

    SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);

    Per salvare

    Editor prefsEditor = mPrefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(myObject); //myObject - instance of MyObject
    prefsEditor.putString("MyObject", json);
    prefsEditor.commit();

    Per ottenere

    Gson gson = new Gson();
    String json = mPrefs.getString("MyObject", "");
    MyObject obj = gson.fromJson(json, MyObject.class);

    Aggiornare 1

    L’ultima versione di EDILETTO può essere scaricato dal github.com/google/gson.

    Update2

    Se si utilizza Gradle/Android Studio appena messo seguenti in build.gradle dipendenze della sezione di

    implementation 'com.google.code.gson:gson:2.6.2'
    • Alla ricerca promettente. provare questo prima.
    • Ha funzionato per me. Impressionante..
    • non funziona nel mio caso. Anche dopo aver messo vaso in libs e impostazione nel build path, Ediletto classe non sempre risolto.
    • Pulire il progetto quindi si tenta @ShirishHerwade
    • che, inoltre, non funziona. Mi potete dire la procedura per l’utilizzo che jar per rimuovere l’errore di cui sopra. Perché ho aggiunto che jar nella cartella librerie, e poi in “java build path” anche provato ad aggiungere esternamente la memorizzazione di json sul mio desktop
    • scarica codice di lavoro mediafire.com/download/iued27pf025e1uw/GSonDemo.rar
    • E ‘ una grande risposta!!!
    • Questa risposta sarebbe ancora meglio se è menzionato anche i suoi limiti. Che tipo di oggetto può e non si possono memorizzare e recuperare in questo modo? Ovviamente non funziona per tutte le classi.
    • Penso Ediletto riesce a gestire il tutto code.google.com/p/google-gson
    • String json = gson.toJson("MyObject"); dovrebbe essere l’oggetto non una Stringa.
    • Grazie per la soluzione.
    • Una nota importante dovrebbe essere presa quando si utilizza in questo modo: Data oggetto non può essere archiviato con precisione al millisecondo verrà ignorato ) il motivo è che Data oggetto sarà rappresentata da toString() in modo implicito, dove nessun millisecondo contati… così fortemente vi consiglio di utilizzare a lungo per rappresentare il tempo, invece della Data oggetto…
    • Grazie @ParagChauhan, salvate il mio tempo ad archiviare il tutto come stringa.. 🙂
    • Hai fatto così facile 🙂
    • Questo è un problema con la circolare di riferimento che porta a StackOverFlowException xD Leggi di più qui stackoverflow.com/questions/10209959/…
    • quello che per cercare di salvarlo come generico . Classe<T> obj = ediletto.fromJson(json, Classe<T>.classe); .
    • Funziona molto bene, è il modo più semplice per utilizzare SharedPreferences con l’oggetto. Grazie per questo suggerimenti.
    • Dovrebbe essere accettata la risposta.

  3. 44

    possiamo utilizzare Outputstream per l’uscita del nostro Oggetto di memoria interna. E la conversione a stringa di salvare in preferenza. Per esempio:

        mPrefs = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor ed = mPrefs.edit();
        ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
    
        ObjectOutputStream objectOutput;
        try {
            objectOutput = new ObjectOutputStream(arrayOutputStream);
            objectOutput.writeObject(object);
            byte[] data = arrayOutputStream.toByteArray();
            objectOutput.close();
            arrayOutputStream.close();
    
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            Base64OutputStream b64 = new Base64OutputStream(out, Base64.DEFAULT);
            b64.write(data);
            b64.close();
            out.close();
    
            ed.putString(key, new String(out.toByteArray()));
    
            ed.commit();
        } catch (IOException e) {
            e.printStackTrace();
        }

    quando abbiamo la necessità di estrarre l’Oggetto dal Preferenza. Utilizzare il codice come di seguito

        byte[] bytes = mPrefs.getString(indexName, "{}").getBytes();
        if (bytes.length == 0) {
            return null;
        }
        ByteArrayInputStream byteArray = new ByteArrayInputStream(bytes);
        Base64InputStream base64InputStream = new Base64InputStream(byteArray, Base64.DEFAULT);
        ObjectInputStream in;
        in = new ObjectInputStream(base64InputStream);
        MyObject myObject = (MyObject) in.readObject();
    • Ciao, so che questo è stato pubblicato un po ‘ di tempo fa, ma sei sicuro che il codice per l’estrazione del memorizzati oggetto è corretto? Io sono sempre più errori sulle ultime 2 righe di piagnucolare su come esplicitamente costruttori devono essere definiti, piuttosto che semplicemente “new ObjectInputStream(video)”. Grazie per l’aiuto!
    • Ho appena aggiornato il codice.
    • Ciao, ho improvvisamente trovato un EOFException in = new ObjectInputStream(base64InputStream); sto scrivendo condiviso preferenze esattamente nello stesso modo in cui si sta facendo. Cosa pensate che potrebbe essere sbagliato?
    • Hai qualche eccezione quando si scrive Oggetto pref? Da SDK:Gettato EOFException quando un programma non incontra la fine del file o stream durante un’operazione di input.
    • Hai fatto la mia giornata 🙂
    • Complimenti, questa è la soluzione migliore mi sono imbattuto in questo problema finora. Senza dipendenze. Tuttavia, va notato che, per essere in grado di utilizzare ObjectOutput/InputStream per un oggetto, l’oggetto e tutti gli oggetti personalizzati all’interno di essa deve implementare l’interfaccia Serializable.

  4. 8

    Ho avuto lo stesso problema, ecco la mia soluzione:

    Ho class MyClass e ArrayList< MyClass > che voglio salvare Condiviso Preferenze. Prima ho aggiunto un metodo di Classe che converte in oggetto JSON:

    public JSONObject getJSONObject() {
        JSONObject obj = new JSONObject();
        try {
            obj.put("id", this.id);
            obj.put("name", this.name);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return obj;
    }

    Quindi ecco il metodo per il salvataggio “oggetto ArrayList< MyClass > elementi”:

    SharedPreferences mPrefs = context.getSharedPreferences("some_name", 0);
        SharedPreferences.Editor editor = mPrefs.edit();
    
        Set<String> set= new HashSet<String>();
        for (int i = 0; i < items.size(); i++) {
            set.add(items.get(i).getJSONObject().toString());
        }
    
        editor.putStringSet("some_name", set);
        editor.commit();

    Ed ecco il metodo per recuperare l’oggetto:

    public static ArrayList<MyClass> loadFromStorage() {
        SharedPreferences mPrefs = context.getSharedPreferences("some_name", 0);
    
        ArrayList<MyClass> items = new ArrayList<MyClass>();
    
        Set<String> set = mPrefs.getStringSet("some_name", null);
        if (set != null) {
            for (String s : set) {
                try {
                    JSONObject jsonObject = new JSONObject(s);
                    Long id = jsonObject.getLong("id"));
                    String name = jsonObject.getString("name");
                    MyClass myclass = new MyClass(id, name);
    
                    items.add(myclass);
    
                } catch (JSONException e) {
                    e.printStackTrace();
             }
        }
        return items;
    }

    Nota che StringSet in comune Preferenze è disponibile a partire dalle API 11.

    • Risolto il mio problema. Voglio aggiungere qualcosa. Per il primo utilizzo è necessario controllare se il set è null. se (set!!! = null){ for (String s : set) {..}}
    • Ho aggiunto null controllare come suggerito. Grazie.
  5. 7

    Utilizzando Ediletto Biblioteca:

    dependencies {
    compile 'com.google.code.gson:gson:2.8.2'
    }

    Store:

    Gson gson = new Gson();
    //Your json response object value store in json object
    JSONObject jsonObject = response.getJSONObject();
    //Convert json object to string
    String json = gson.toJson(jsonObject);
    //Store in the sharedpreference
    getPrefs().setUserJson(json);

    Recuperare:

    String json = getPrefs().getUserJson();
  6. 1

    Si potrebbe utilizzare EDILETTO, utilizzando Gradle Costruire.gradle :

    implementation 'com.google.code.gson:gson:2.8.0'

    Poi nel codice, ad esempio coppie di stringa, un valore booleano con Kotlin :

            val nestedData = HashMap<String,Boolean>()
            for (i in 0..29) {
                nestedData.put(i.toString(), true)
            }
            val gson = Gson()
            val jsonFromMap = gson.toJson(nestedData)

    Aggiunta di SharedPrefs :

            val sharedPrefEditor = context.getSharedPreferences(_prefName, Context.MODE_PRIVATE).edit()
            sharedPrefEditor.putString("sig_types", jsonFromMap)
            sharedPrefEditor.apply()

    Ora per recuperare i dati :

    val gson = Gson()
    val sharedPref: SharedPreferences = context.getSharedPreferences(_prefName, Context.MODE_PRIVATE)
    val json = sharedPref.getString("sig_types", "false")
    val type = object : TypeToken<Map<String, Boolean>>() {}.type
    val map = gson.fromJson(json, type) as LinkedTreeMap<String,Boolean>
    for (key in map.keys) {
         Log.i("myvalues", key.toString() + map.get(key).toString())
    }
  7. 1

    È possibile farlo utilizzando il PowerPreference libreria in 3 semplici passi!

    https://github.com/AliAsadi/PowerPreference

    1. Creare L’Oggetto

    Object obj = new Object();

    2. Scrivere condiviso preferenza

    PowerPreference.getDefaultFile().put("object",obj);

    3. Ottenere l’oggetto

    Object obj = PowerPreference.getDefaultFile()
                                .getObject("object", Object.class);
  8. 0

    Utilizzo di questo oggetto –> TinyDB–Android-Condiviso-Preferenze-Turbo è molto semplice.
    è possibile salvare la maggior parte degli oggetti di uso comune come array di interi, stringhe, liste, ecc

    • Cool, ma credo che questo funziona solo per primitie tipi (String, double, int, ecc) non per gli oggetti personalizzati (POJO)
    • ora funziona per gli oggetti personalizzati, il file ReadMe, è stato aggiornato
  9. 0

    È possibile utilizzare Complesso Preferenze Android – da filippo Silvestre biblioteca per memorizzare i vostri oggetti personalizzati.
    In sostanza, utilizzando EDILETTO meccanismo per memorizzare gli oggetti.

    Per salvare un oggetto in pref:

    User user = new User();
    user.setName("Felipe");
    user.setAge(22); 
    user.setActive(true); 
    
    ComplexPreferences complexPreferences = ComplexPreferences.getComplexPreferences(
         this, "mypref", MODE_PRIVATE);
    complexPreferences.putObject("user", user);
    complexPreferences.commit();

    E recuperare di nuovo:

    ComplexPreferences complexPreferences = ComplexPreferences.getComplexPreferences(this, "mypref", MODE_PRIVATE);
    User user = complexPreferences.getObject("user", User.class);
  10. -2

    Avete bisogno di recuperare l’oggetto, anche dopo l’applicazione di chiudere donw o durante l’esecuzione ?

    È possibile memorizzare in un database.

    O Semplicemente per creare un’Applicazione personalizzata di classe.

    public class MyApplication extends Application {
    
        private static Object mMyObject;
        //static getter & setter
        ...
    }
    
    <manifest xmlns:android="http://schemas.android.com/apk/res/android">
        <application ... android:name=".MyApplication">
            <activity ... />
            ...
        </application>
        ...
    </manifest>

    E quindi da ogni attività :

    ((MyApplication) getApplication).getMyObject();

    Non è davvero il modo migliore, ma funziona.

  11. -2

    Non c’è modo di memorizzare gli oggetti in SharedPreferences, Quello che ho fatto è creare una classe pubblica, di mettere tutti i parametri di cui ho bisogno e creare setter e getter, sono stato in grado di accedere ai miei oggetti,

Lascia un commento