Autore Topic: Persistenza dati  (Letto 1516 volte)

Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Persistenza dati
« il: 03 Ottobre 2012, 18:25:56 CEST »
0
Buon giorno a tutti,

Ho fatto un'applicazione che prevede la registrazione dell'utente prima d'iniziare la consultazione e trattamendo dati.
Ho previsto fino a un massimo di cinque utenti per terminale ( è previsto un tablet  che verrà condiviso appunto tra questi operatori).

Il problema è che quanto chiudo l'applicazione perdo i dati....

Propongo il codice usato:
Codice: [Seleziona]
    public void onClickLeggiPref(View v) {
        EditText testo02 = (EditText)findViewById(R.id.l1_testo01);
            String pref[] = PreferencesManager.getFromPreferences(this);
            int i = 0;
            String risultato = "";
            while (i <= 4 && pref[i] != null){
                        risultato = risultato + pref[i] + " ";
                        i++;
            }
                testo02.setText(risultato);
    }
   
    public void onClickSalvaPref(View v) {
                EditText testo03 = (EditText)findViewById(R.id.l1_testo01);
                int contatoreOperatori = getSharedPreferences(MIE_PREFERENZE, Context.MODE_PRIVATE).getInt(N_OP, 0);
                //Esegue solo se ci sono meno di cinque operatori già inseriti.
                if (contatoreOperatori <= 4) {
                        String pref = testo03.getText().toString();
                        if (!pref.matches("")){
                                //aggiunge il nome del nuovo operatore.
                            PreferencesManager.saveToPreferences1(this, pref, contatoreOperatori);
                            //Aggiunge alla memoria quanti operatori ci sono.
                            PreferencesManager.saveToPreferences2(this, contatoreOperatori + 1);
                            testo03.setText("");
                        }
                        else{
                                Toast.makeText(this, R.string.l1_richiestaNomOp, Toast.LENGTH_LONG).show();
                        }
                }
                if (contatoreOperatori == 4){
                        Toast.makeText(this, R.string.l1_massimoNumOp, Toast.LENGTH_LONG).show();
                Button tasto02 = (Button)findViewById(R.id.l1_tasto01);
                tasto02.setVisibility(View.GONE);
                testo03.setVisibility(View.GONE);
                }
    }

Da notare che sul Manifest è scritto (vedi persistent):
Codice: [Seleziona]
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:persistent="true">
        <activity android:name=".Cartella1Activity">
                  <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

Da notare che scrivo e recupero tutti i dati regolarmente, se invece chiudo volontariamente "spazzando" le applicazioni in esecuzione perdo i dati contenuti nelle preferenze.
La stessa applicazione gestisce un database con SQLIte, i dati contenuti in quest'ultimo rimangono inalterati.
Se lancio nuovamente l'applicazione, i dati sul DB ci sono, le preferenze NO.

Desidero sapere come fare per rendere persistenti i dati in preferences. Per favore non indicatemi come archiviare in SQL. Voglio capire perché perdo i dati contenuti nelle preferences.

Grazie
Saluti
ceklo
« Ultima modifica: 03 Ottobre 2012, 18:28:30 CEST da ceklo »

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Persistenza dati
« Risposta #1 il: 03 Ottobre 2012, 18:53:29 CEST »
0
La classe "PreferencesManager" non fa' parte del API di Android, esiste "PreferenceManager".

Comunque segui questo tutorial o altri basta cercare, le preferenze devono essere salvate con una chiamata esplicita.

[facile] Semplice esempio di Shared Preferences - Android Developers Italia



adb logcat | tee /tmp/logcat | grep TAG

Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:Persistenza dati
« Risposta #2 il: 03 Ottobre 2012, 19:51:59 CEST »
0
Ciao iceweasel, grazie della risposta,

Utilizzo una classe di apoggio nominata: PreferencesManager, forse questo porta a confusione.

Il caso è che non funziona come desidero, forse non capisco correttamente il significato di:
Citazione
le preferenze devono essere salvate con una chiamata esplicita.
cosa significa esattamente ?
qui sotto propongo una parte del codice che mancava, si tratta del mio PreferencesManager contenuto in una classe omonima.
Codice: [Seleziona]
import android.content.Context;
import android.content.SharedPreferences;

public class PreferencesManager {
    private final static String MIE_PREFERENZE = "MyPref";
    private static final String OPERATORE[] = {"STRING1", "STRING2", "STRING3", "STRING4", "STRING5" };
    private static final String DATA_INT[] = {"0","1","2","3","4"};
    private static String N_OP ;
   
    public static void saveToPreferences1(Context context, String text, int p) {       
        SharedPreferences.Editor editor = context.getSharedPreferences(MIE_PREFERENZE, Context.MODE_PRIVATE).edit();
        editor.putString(OPERATORE[p], text);
        editor.putInt(DATA_INT[p], p);
        editor.commit();
    }

    public static void saveToPreferences2(Context context, int op) {
        SharedPreferences.Editor editor = context.getSharedPreferences(MIE_PREFERENZE, Context.MODE_PRIVATE).edit();
        editor.putInt(N_OP, op);
        editor.commit();
    }
   
    public static String[] getFromPreferences(Context context) {

        String operatore[] = {context.getSharedPreferences(MIE_PREFERENZE, Context.MODE_PRIVATE).getString(OPERATORE[0], ""),
                          context.getSharedPreferences(MIE_PREFERENZE, Context.MODE_PRIVATE).getString(OPERATORE[1], ""),
                          context.getSharedPreferences(MIE_PREFERENZE, Context.MODE_PRIVATE).getString(OPERATORE[2], ""),
                          context.getSharedPreferences(MIE_PREFERENZE, Context.MODE_PRIVATE).getString(OPERATORE[3], ""),
                          context.getSharedPreferences(MIE_PREFERENZE, Context.MODE_PRIVATE).getString(OPERATORE[4], "")};
       
        int puntatore[] = {context.getSharedPreferences(MIE_PREFERENZE, Context.MODE_PRIVATE).getInt(DATA_INT[0], 0),
                       context.getSharedPreferences(MIE_PREFERENZE, Context.MODE_PRIVATE).getInt(DATA_INT[1], 1),
                       context.getSharedPreferences(MIE_PREFERENZE, Context.MODE_PRIVATE).getInt(DATA_INT[2], 2),
                       context.getSharedPreferences(MIE_PREFERENZE, Context.MODE_PRIVATE).getInt(DATA_INT[3], 3),
                       context.getSharedPreferences(MIE_PREFERENZE, Context.MODE_PRIVATE).getInt(DATA_INT[4], 4)};
        return operatore;
    }
   
}

Grazie
saluti
ceklo
« Ultima modifica: 03 Ottobre 2012, 19:55:45 CEST da ceklo »

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Persistenza dati
« Risposta #3 il: 03 Ottobre 2012, 20:30:59 CEST »
0
Nel tuo codice precedente non c'era la chiamata al commit dei dati, deve essere chiamato in modo opportuno altrimenti perdi i dati.

Consiglio di studiare meglio la documentazione di Android e i tutorial sull'argomento.

adb logcat | tee /tmp/logcat | grep TAG

Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:Persistenza dati
« Risposta #4 il: 04 Ottobre 2012, 13:53:40 CEST »
0
Salve,

E' tutto il giorno che cerco la soluzione...
Non trovo niente di non conforme al tutorial, eppure quando elimino l'applicazione tra quelle in esecuzione perdo i dati.

Per archiviare ogni dato invoco l'istruzione commit, I dati vengono effettivamente salvati. E poi li recupero senza problemi...
Ma devono "persistere" oltre la chiusura forzata dell'applicazione.

Ho trascurato qualcosa?

Grazie
Saluti
ceklo

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
R: Persistenza dati
« Risposta #5 il: 04 Ottobre 2012, 13:56:18 CEST »
0
Ma non è che per caso ogni volta che fai partire l'emulatore (e quindi installi l'applicazione) ti azzeri inavvertitamente il database?

Inviato dal mio XT910 con Tapatalk 2


Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:Persistenza dati
« Risposta #6 il: 04 Ottobre 2012, 14:05:23 CEST »
0
Grazie Sakazaki della risposta,

No, lo faccio direttamente sul telefonino completamente  scollegato dall'emulatore.

Ogni modifica al codice la provo sul telefonio, ma prima, per evitare pasticci cancello i dati precedenti e disinstallo la vecchia versione.

Quindi ad ogni nuova installazione il dispositivo è "pulito".

Ebbene, lancio la mia applicazione, salvo le mie preferenze, chiudo, riapro e trovo tutto.
Poi vado dal menu principale del telefonino, vado alla pagina applicativi in esecuzione, premo il pulsante con la forma di scopa (spazzo via). Plufff, i dati non ci sono più al nuovo riavvio....

La stessa procedura la facio con il tutorial e i dati rimangono anche dopo l'arresto dei programmi in esecuzione.

Non ho capito ancora dove è il problema.

Grazie
Saluti
ceklo
« Ultima modifica: 04 Ottobre 2012, 14:09:39 CEST da ceklo »

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Persistenza dati
« Risposta #7 il: 04 Ottobre 2012, 14:11:44 CEST »
0
Non capisco cosa vuoi ottenere.

La tua applicazione salva dei dati e tu vuoi che:
1. al prossimo avvio i dati vengano di nuovo visualizzati;
2. se pulisci i dati dell'applicazione tramite "Gestione applicazioni" di android i dati vengano di nuovo visualizzati;
3. dopo che disinstalli l'applicazione e la installi nuovamente i dati vengano di nuovo visualizzati.

Le SharedPreference ti aiutano solo ed esclusivamente nel caso 1., in tutti gli altri casi devi usare metodi di persistence diversi (file sul dispositivo o server remoto).

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Persistenza dati
« Risposta #8 il: 04 Ottobre 2012, 14:22:28 CEST »
0
Non so sicuro di comprendere il problema. Però, se stai dicendo che aprendo l'app non ci trovi i dati salvati in precedenza, una possibile causa è che alla precedente esecuzione ci hai salvato una chiave come NULL e alla riapertura le preferenze crashano resettando tutto.

E' facile da provare. Sostituisci il contenuto delle tue funzioni di leggi/scrivi con una lettura/scrittura di una preferenza con chiave e contenuto statici. E vedi se persiste.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline ceklo

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Re:Persistenza dati
« Risposta #9 il: 06 Ottobre 2012, 08:58:52 CEST »
0
possibile causa è che alla precedente esecuzione ci hai salvato una chiave come NULL e alla riapertura le preferenze crashano resettando tutto.

E' facile da provare. Sostituisci il contenuto delle tue funzioni di leggi/scrivi con una lettura/scrittura di una preferenza con chiave e contenuto statici. E vedi se persiste.

Grazie bradipao, era proprio così, come da te ipotizzato.

Ringrazio
Saluti
ceklo
« Ultima modifica: 06 Ottobre 2012, 09:02:32 CEST da ceklo »