Autore Topic: Come gestisco le preferenze?  (Letto 255 volte)

Offline d4®io

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
Come gestisco le preferenze?
« il: 03 Aprile 2018, 19:40:19 CEST »
0
Ciao ragazzi, chi ha voglia di mostrarmi un esempio pratico sull’utilizzo delle SharedPreferences?
Ad esempio, nel mio caso avrei bisogno di salvare due coordinate (pX e pY) che rimangano memorizzate sul dispositivo in uso.

So che si tratta di poche righe di codice, ma non ho molta pratica a riguardo e questa cosa mi serve “ieri”. A parte gli scherzi, qualcuno gentilmente può mostrarmi come meglio procedere?

Un esempio del mio codice...

Codice (Java): [Seleziona]
private void gestionePreferenze() {
        final String PREF_NOME = "Opzioni";
        String PREF_PX = "";
        String PREF_PY = "";      

        String preferenzaXutente = String.valueOf(x); ← variabile globale
        String preferenzaYutente = String.valueOf(y);  ← variabile globale
     
        SharedPreferences preferences = getSharedPreferences(PREF_NOME, MODE_PRIVATE);
        String versioneSalvataPx = preferences.getString(PREF_PX, preferenzaXutente);
        String versioneSalvataPy = preferences.getString(PREF_PY, preferenzaYutente);
     
        SharedPreferences.Editor editor = preferences.edit();
   
        if(!preferenzaXutente.equalsIgnoreCase(String.valueOf(versioneSalvataPx))) {
            editor.putString(String.valueOf(PREF_PX), preferenzaXutente).apply();            
        }
       if(!preferenzaYutente.equalsIgnoreCase(String.valueOf(versioneSalvataPy))) {
            editor.putString(String.valueOf(PREF_PY), preferenzaYutente).apply();        
        }  

        Log.i("PREFERENZE ", String.valueOf(preferences.getString("PREF_NOME", PREF_NOME)));
        Log.i("PREF_X ", String.valueOf(preferences.getString("PREF_PX",versioneSalvataPx)));
        Log.i("PREF_Y ", String.valueOf(preferences.getString("PREF_PY", versioneSalvataPy)));
        Log.i("TUTTO  ", String.valueOf(preferences.getAll())); ← qui mi stampa dei valori a caso
 
/* se i valori sono questi
    I/PREF_X: -9
    I/PREF_Y: -8
    perché mi stampa
    I/TUTTO: {0=-1}*/

     
    }

Dove sbaglio?
Se non capite qualcosa domandate pure...

Come al solito ringrazio in anticipo, ciao e buona serata.

Offline berpao

  • Utente normale
  • ***
  • Post: 160
  • Respect: +20
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Come gestisco le preferenze?
« Risposta #1 il: 04 Aprile 2018, 08:51:38 CEST »
0
Ciao,
scusa io non ho ben capito le variabili pref_px/pref_py, forse non ho capito io ma magari il problema è lì.
Dunque qui

Codice (Java): [Seleziona]
        String PREF_PX = "";
        String PREF_PY = "";  

le dichiari come variabili stringa senza nessun valore particolare

Qui poi

Codice (Java): [Seleziona]
        String versioneSalvataPx = preferences.getString(PREF_PX, preferenzaXutente);
        String versioneSalvataPy = preferences.getString(PREF_PY, preferenzaYutente);

le provi ad usare, da quello che capisco, per recuperare il valore, ma entrambe in questo momento hanno lo stesso valore e da quello ceh capisco è come se avessi scritto

Codice (Java): [Seleziona]
        String versioneSalvataPx = preferences.getString("", preferenzaXutente);
        String versioneSalvataPy = preferences.getString("", preferenzaYutente);
usando quindi "" come chiave

Qui
Codice (Java): [Seleziona]
        if(!preferenzaXutente.equalsIgnoreCase(String.valueOf(versioneSalvataPx))) {
            editor.putString(String.valueOf(PREF_PX), preferenzaXutente).apply();            
        }
       if(!preferenzaYutente.equalsIgnoreCase(String.valueOf(versioneSalvataPy))) {
            editor.putString(String.valueOf(PREF_PY), preferenzaYutente).apply();        
        }  

a parte che PREF_PX è già una stringa quindi lo string.valueOf non serve, ma salvi nelle prefereze sulla stessa chiave (che è ancora "") il valore, quindi PREF_PY sovrascrive PREF_PX

Infine qui
Codice (Java): [Seleziona]
        Log.i("PREF_X ", String.valueOf(preferences.getString("PREF_PX",versioneSalvataPx)));
        Log.i("PREF_Y ", String.valueOf(preferences.getString("PREF_PY", versioneSalvataPy)));

provi a recuperare il valore salvata ma non usi la variabile PREF_PX o PREF_PY, usi la chiave "PREF_PX" e "PREF_PY"
Sto sbagliando ad interpretare il codice?
Ciao
P

Offline d4®io

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
Re:Come gestisco le preferenze?
« Risposta #2 il: 04 Aprile 2018, 11:23:04 CEST »
0
Ciao,
scusa io non ho ben capito le variabili pref_px/pref_py, forse non ho capito io ma magari il problema è lì.
Dunque qui

Codice (Java): [Seleziona]
        String PREF_PX = "";
        String PREF_PY = "";  

le dichiari come variabili stringa senza nessun valore particolare

OK! Quindi correggo in questo modo:
Codice (Java): [Seleziona]
        String PREF_PX = "0";
        String PREF_PY = "0";

Qui poi

Codice (Java): [Seleziona]
        String versioneSalvataPx = preferences.getString(PREF_PX, preferenzaXutente);
        String versioneSalvataPy = preferences.getString(PREF_PY, preferenzaYutente);

le provi ad usare, da quello che capisco, per recuperare il valore, ma entrambe in questo momento hanno lo stesso valore e da quello ceh capisco è come se avessi scritto

Codice (Java): [Seleziona]
        String versioneSalvataPx = preferences.getString("", preferenzaXutente);
        String versioneSalvataPy = preferences.getString("", preferenzaYutente);
usando quindi "" come chiave


Bravo, è proprio questo passaggio che non mi è chiaro...
Quindi se inserisco 
Codice (Java): [Seleziona]
        String versioneSalvataPx = preferences.getString("PREF_PX", preferenzaXutente);
        //  Qui mi viene salvato il parametro stringa che equivale a 0? Non viene salvato il parametro passato dall'utente?      
        String preferenzaXutente = String.valueOf(x); ← questo parametro

...a parte che PREF_PX è già una stringa quindi lo string.valueOf non serve, ma salvi nelle prefereze sulla stessa chiave (che è ancora "") il valore, quindi PREF_PY sovrascrive PREF_PX

Ho modificato quel metodo un sacco di volte, non ho controllato bene prima di fare copia/incolla...

Bene! Come faccio a salvare due parametri distinti? Mi fai un esempio cortesemente?

No, hai interpretato bene il codice, adesso puoi aiutarmi?

Voglio salvare e riutilizzare 2 coordinate (x e y), ho bisogno di sapere in che modo devo inserire i dati, grazie caro.
« Ultima modifica: 04 Aprile 2018, 11:25:13 CEST da d4®io »

Offline berpao

  • Utente normale
  • ***
  • Post: 160
  • Respect: +20
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Come gestisco le preferenze?
« Risposta #3 il: 04 Aprile 2018, 13:50:39 CEST »
+1
Ciao,
Citazione
OK! Quindi correggo in questo modo:
Codice (Java): [Seleziona]
        String PREF_PX = "0";
        String PREF_PY = "0";
No, se ho capito bene il senso delle variabili PREF_PX/PREF_PY tu le stai usando come chiavi per salvare i valori delle preferenze. Mi Spiego; le preferenze vengono salvate come coppia chiave-valore; vuol dire che se vuoi salvare 2/3/4/n valori distinti, dovrai avere rispettivamente 2/3/4/n chiave distinte. nel tuo esempio, io farei:

Codice (Java): [Seleziona]
        String PREF_PX = "coordX_key"; //ovviamente dagli il valore che vuoi,basta che sia diverso dalla PREF_PY
        String PREF_PY = "coordY_key"; //ovviamente dagli il valore che vuoi,basta che sia diverso dalla PREF_PX
        String PREF_PZ = "coordZ_key"; //ho aggiunto anche questa che a te non serve ma giusto per farti capire come muoverti in caso   volessi salvare un ulteriore valore

A questo punto per leggere il valore dalle preferenze dovresti fare:
Codice (Java): [Seleziona]
        //recupera il valore dalla chiave identificata dal valore della variabile PREF_PX, che è "coordX_key"
        //Se la chiave "coordX_key" non è mai stata salvata e non viene trovata, allora viene restituito il valore della variabile preferenzaXutente
        String versioneSalvataPx = preferences.getString(PREF_PX, preferenzaXutente);
        //recupera il valore dalla chiave identificata dal valore della variabile PREF_PY, che è "coordY_key"
        //Se la chiave "coordY_key" non è mai stata salvata e non viene trovata, allora viene restituito il valore della variabile preferenzaYutente
        String versioneSalvataPy = preferences.getString(PREF_PY, preferenzaYutente);
        .....

che è identico ad aver scritto
Codice (Java): [Seleziona]
        String versioneSalvataPx = preferences.getString("coordX_key", preferenzaXutente);
        String versioneSalvataPy = preferences.getString("coordY_key", preferenzaYutente);
        .....


Ora per salvare le preferenze dovresti modificare così il codice:

Citazione
        SharedPreferences.Editor editor = preferences.edit();
   
        if(!preferenzaXutente.equalsIgnoreCase(String.valueOf(versioneSalvataPx))) {
            editor.putString(PREF_PX, preferenzaXutente);           
        }
       if(!preferenzaYutente.equalsIgnoreCase(String.valueOf(versioneSalvataPy))) {
            editor.putString(PREF_PY, preferenzaYutente);         
        } 
       //Così fai il slavataggio una sola volta per tutte le modifiche fatte
       editor.commit();

In questo modo crei/modifichi il valore precedentemente salvato nella chiave PREF_PX o PREF_PY con il nuovo valore inserito.
Questo poteva essere scritto anche:
Citazione
        SharedPreferences.Editor editor = preferences.edit();
   
        if(!preferenzaXutente.equalsIgnoreCase(String.valueOf(versioneSalvataPx))) {
            editor.putString("coordX_key", preferenzaXutente);           
        }
       if(!preferenzaYutente.equalsIgnoreCase(String.valueOf(versioneSalvataPy))) {
            editor.putString("coordY_key", preferenzaYutente);         
        } 
       //Così fai il slavataggio una sola volta per tutte le modifiche fatte
       editor.commit();

Ovviamente controlla il codice dal punto di vista sintattico, non l'ho preso da codice esistente ma l'ho scritto al volo, quindi potrebbero esserci errori...
Ciao
P

Offline d4®io

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
Re:Come gestisco le preferenze?
« Risposta #4 il: 04 Aprile 2018, 17:53:41 CEST »
0
Adesso faccio alcune prove, poi ti farò sapere come è andata.
Ad ogni modo grazie per la dritta.  ;-)

Post unito: [time]04 Aprile 2018, 18:24:11 CEST[/time]
Anche provando a modo tuo i valori non cambiano. Questo è il metodo:
Codice (Java): [Seleziona]
private void gestionePreferenze() {
        final String PREF_NOMEC = "Coordinate";
        String PREF_PX = "CX";
        String PREF_PY = "CY";

        // questi valori vengono recuperati da una TextView
        String preferenzaXutente = String.valueOf(x); // esempio x: -5
        String preferenzaYutente = String.valueOf(y); // esempio y: 3

        SharedPreferences preferences = getSharedPreferences(PREF_NOMEC, MODE_PRIVATE);
        String versioneSalvataPx = preferences.getString(PREF_PX, preferenzaXutente);
        String versioneSalvataPy = preferences.getString(PREF_PY, preferenzaYutente);

        SharedPreferences.Editor editor = preferences.edit();
     
        if(!preferenzaXutente.equalsIgnoreCase(String.valueOf(versioneSalvataPx))) {
            editor.putString("CX", preferenzaXutente);
        }
        if(!preferenzaYutente.equalsIgnoreCase(String.valueOf(versioneSalvataPy))) {
            editor.putString("CY", preferenzaYutente);
        }

        editor.commit();

        Log.i("PREFERENZE ", preferences.getString("PREF_NOMEC",PREF_NOMEC));
        Log.i("PREF_X ",preferences.getString("PREF_PX", "CX"));
        Log.i("PREF_Y ", preferences.getString("PREF_PY", "CY"));
        Log.i("TUTTO  ", String.valueOf(preferences.getAll()));

        editor.clear(); // cancello perché sto eseguendo delle prove
    }

Non ho ancora capito come recupero gli eventuali valori salvati.
Questo è quanto leggo durante la stampa del Log:
********************************************
I/PREFERENZE: Coordinate
I/PREF_X: CX
I/PREF_Y: CY
I/TUTTO: {0=-1}
********************************************

Nonostante X valga 3 e Y valga -2...

Ok modificando in questo modo
Codice (Java): [Seleziona]
        Log.i("PREFERENZE ", preferences.getString("PREF_NOMEC",PREF_NOMEC));
        Log.i("PREF_X ",preferences.getString("PREF_PX", versioneSalvataPx));
        Log.i("PREF_Y ", preferences.getString("PREF_PY", versioneSalvataPy));
        Log.i("TUTTO  ", String.valueOf(preferences.getAll()));

Tutto combacia tranne
Codice (Java): [Seleziona]
Log.i("TUTTO  ", String.valueOf(preferences.getAll())); // che mi restituisce sempre → I/TUTTO: {0=-1}
Post unito: [time]04 Aprile 2018, 18:47:33 CEST[/time]
Cortesemente, fammi solo capire se
Codice (Java): [Seleziona]
preferences.getAll();È la maniera corretta per recuperare tutte le preferenze presenti nel dispositivo. Ho un'altro file per gli aggiornamenti dove salvo solo il numero della versione. E probabilmente (o almeno credo) quel numero 1 indica la versione salvata, però il nome del file è diverso, boh...



Post unito: 04 Aprile 2018, 19:40:59 CEST
Aprendo il Device File Explorer mi sono reso conto che esisteva una vecchia chiave "0", così ho fatto che eliminarla a mano. L'unica cosa che non mi è chiara è la cancellazione di questi file. In teoria con il comando 

Codice (Java): [Seleziona]
editor.clear();
dovrei rimuovere il file, perlomeno svuotarlo, ma questo non fa nulla, vabbuò cià cià ciao.
« Ultima modifica: 04 Aprile 2018, 19:40:59 CEST da d4®io, Reason: Merged DoublePost »

Offline berpao

  • Utente normale
  • ***
  • Post: 160
  • Respect: +20
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Come gestisco le preferenze?
« Risposta #5 il: 05 Aprile 2018, 08:11:19 CEST »
0
Ciao
Citazione
Aprendo il Device File Explorer mi sono reso conto che esisteva una vecchia chiave "0", così ho fatto che eliminarla a mano. L'unica cosa che non mi è chiara è la cancellazione di questi file. In teoria con il comando 

Codice (Java): [Seleziona]
editor.clear();

dovrei rimuovere il file, perlomeno svuotarlo, ma questo non fa nulla, vabbuò cià cià ciao.

fare il clear non basta, qualunque modifica fatta alle preferences deve essere confermata con il commit(), guarda la documentazione qui

Ciao
P

Post unito: 05 Aprile 2018, 08:27:04 CEST
Ciao, cmq

Codice (Java): [Seleziona]
Log.i("PREFERENZE ", preferences.getString("PREF_NOMEC",PREF_NOMEC));
        Log.i("PREF_X ",preferences.getString("PREF_PX", "CX"));
        Log.i("PREF_Y ", preferences.getString("PREF_PY", "CY"));
        Log.i("TUTTO  ", String.valueOf(preferences.getAll()));

questo codice è sbagliato; il primo parametro di preferences.getString() rappresenta la chiave in cui è salvata la preferenza e tu non leggi/salvi nella chiave "PREF_NOMEC" o "PREF_PX" o "PREF_PY". Le chiavi in cui tu salvi i valori sono "CX" e "CY" (stringhe memorizzate nelle variabili PREF_PX e PREF_PY), quindi per recuperare i valori avresti dovuto scrivere:

Codice (Java): [Seleziona]
Log.i("PREFERENZE ", preferences.getString(PREF_NOMEC,PREF_NOMEC));
        Log.i("PREF_X ",preferences.getString(PREF_PX, "CX"));
        Log.i("PREF_Y ", preferences.getString(PREF_PY, "CY"));
        Log.i("TUTTO  ", String.valueOf(preferences.getAll()));

Quello che succede nel tuo codice è che stai dicendo: "Stampami nel logcat il valore della preferenza salvata nella chiave PREF_PX". Se invece di scrivere PREF_PX come stringa (quindi tra i doppi apici) la scrivi come ti ho detto io, allora PREF_PX viene interpretata come una variabile e quindi viene usata la stringa che questa variabile contiene come chiave per il recupero della preferenza, cioè "CX".
Non so se mi sono spiegato, fammi sapere se è tutot chiaro.
« Ultima modifica: 05 Aprile 2018, 08:27:04 CEST da berpao, Reason: Merged DoublePost »

Offline d4®io

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
Re:Come gestisco le preferenze?
« Risposta #6 il: 05 Aprile 2018, 09:07:47 CEST »
0
OK! Adesso è tutto più chiaro.

Ciao e grazie...