Pro e contro di SQLite e preferenze condivise [chiuso]


156

Qual è il buon meccanismo per archiviare informazioni tra il database SQLite e le Preferenze condivise?

Perché usare le preferenze condivise? Perché usare sqlite? Ho provato a trovare la differenza tra loro e qual è il meccanismo migliore per l'archiviazione dei dati, ma non riesco a trovare la risposta appropriata su Google. Ti prego, aiutami con esempi e spiegazioni.


Dipende praticamente dal tipo di dati che si desidera archiviare. SharedPreferences consente un accesso più rapido e semplice ai dati, è più comodo da usare quando si mantengono piccole quantità di dati.
Egor,

2
Non archiviare nulla in Preferenze condivise tranne semplici stringhe e primitive - e se si utilizza un file separato per ciascuno - nonostante i documenti le Preferenze condivise non siano sicure per i thread e anche se utilizzate esclusivamente sul thread principale estremamente inclini alla corruzione, se si desidera archiviare di più di 1 coppia valore-chiave in un file.
RunLoop

Le preferenze condivise vengono memorizzate nella cache dopo il primo utilizzo, quindi dovrebbero essere piuttosto veloci negli usi successivi di lettura.
Stan,

Risposte:


169

Dipende molto dai dati che si desidera archiviare.

SQLite

Grandi quantità di stessi dati strutturati devono essere archiviate in un database SQLite poiché i database sono progettati per questo tipo di dati. Poiché i dati sono strutturati e gestiti dal database, è possibile eseguire una query per ottenere un sottoinsieme dei dati che soddisfa determinati criteri utilizzando un linguaggio di query come SQL. Ciò rende possibile la ricerca nei dati. Naturalmente la gestione e la ricerca di grandi quantità di dati influenza le prestazioni, quindi la lettura dei dati da un database può essere più lenta della lettura dei dati da SharedPreferences.

SharedPreferences

SharedPreferences è un archivio chiave / valore in cui è possibile salvare un dato con una determinata chiave. Per leggere i dati dal negozio devi conoscere la chiave dei dati. Questo rende la lettura dei dati molto semplice. Ma per quanto sia facile archiviare una piccola quantità di dati, è altrettanto difficile archiviare e leggere dati strutturati di grandi dimensioni in quanto è necessario definire la chiave per ogni singolo dato, inoltre non è possibile effettuare ricerche all'interno dei dati se non si dispone di un determinato concetto di nominare le chiavi.


24
Per fare un esempio, SharedPreferences è utile per archiviare le preferenze dell'utente, dove sono presenti solo poche variabili che devono essere archiviate. D'altra parte SQLite sarebbe meglio per l'archiviazione di dati in cui è presente un ampio set di elementi, come i titoli dei brani in una libreria musicale che devono essere cercati.
CL22,

5
Non è necessario conoscere i nomi delle chiavi per utilizzare SharedPreferences. Vedi getAll ().
ZaBlanc,

5
Cordiali saluti, esiste una TERZA opzione: leggere / scrivere XML in un file. (Vedi le classi android.util.xml). Adatto per dati moderatamente complessi che possono essere letti / scritti tutti in una volta. Ad esempio, una griglia di valori che l'utente non cambia frequentemente. Soprattutto se si tratta di dati che potresti voler inviare successivamente altrove, quindi saranno necessari in un formato analizzabile.
ToolmakerSteve

1
è consigliabile salvare un json come stringa json nel pref condiviso?
Kaveesh Kanwal,

2
@JCarlos Fintanto che non stai facendo cose cross process, starai bene usando SharedPreferences.
Mygod

97

Questa domanda ha una risposta accettata, ma penso che ci sia altro da dire sull'argomento: la velocità.

SharedPreferences e Sqlite DB di un'applicazione sono entrambi solo file, archiviati nelle directory dell'applicazione sul file system del dispositivo. Se la quantità di dati non è troppo grande, l'opzione Sqlite coinvolgerà un file più grande e più complicato con un sovraccarico di elaborazione per un semplice accesso.

Quindi, se la natura dei dati non determina la tua scelta (come spiegato nella risposta accettata) e la velocità è importante, allora probabilmente sei meglio usare SharedPreferences.

E la lettura di alcuni dati è spesso sul percorso critico per visualizzare l'attività principale, quindi penso che la velocità sia spesso molto importante.

Un'ultima considerazione per quanto riguarda velocità ed efficienza: se è necessario utilizzare un database Sqlite per alcuni dati strutturati, è probabilmente più efficiente memorizzare anche le preferenze dell'utente nel database in modo da non aprire un secondo file. Questa è una considerazione abbastanza piccola - probabilmente vale la pena considerare solo se è necessario accedere sia ai dati strutturati che alle preferenze prima di poter visualizzare l'attività principale.


6
Che dire della leggibilità del codice? Penso che quando si memorizzano più record in SharedPrefs anziché in una tabella db, il codice diventa contorto. La sintassi SQL è più facile da leggere rispetto al ciclo su voci SharedPrefs ...
IgorGanapolsky

8
Igor, non sarei d'accordo. Le preferenze condivise sono in realtà unidimensionali, è molto semplice utilizzare una preferenza. Ad esempio, sto creando un'app per il controllo delle scorte, sto semplicemente memorizzando i simboli delle scorte nelle preferenze. Non ho bisogno di afferrarli singolarmente, poiché li elenco sempre tutti, e questo è tutto ciò che faccio, archiviare o afferrare. È così semplice, molto più semplice rispetto all'utilizzo di un DB.
AutoM8R,

1
Non riesco a pensare a una situazione in cui la leggibilità del codice diventa difficile mentre la struttura dei dati da salvare non richiede l'uso di un database gerarchico. Anche se ci sono problemi di leggibilità, può essere risolto utilizzando una classe wrapper con le funzioni richieste.
Sarath Sadasivan Pillai,

1
Possiamo archiviare più valori-chiave sotto forma di jsonstring dei dati nelle preferenze condivise? Esiste un limite di caratteri che può troncare i miei valori json?
Nova,

2
Le preferenze condivise vengono caricate nella memoria una sola volta (per ciclo di vita del processo dell'app) e conservate lì; dopodiché è sempre super veloce. Quindi non c'è davvero alcuna prestazione pratica vincente inserendo i dati SharedPref in SQLite (solo per evitare l'accesso extra ai file SharedPref). E tra l'altro non dovresti mettere le tue cose SQLite in SharedPrefs; come ho detto, è sempre nella memoria che potrebbe causare problemi (memoria insufficiente).
Zsolt Safrany,

20

La mia opinione è che non si tratta di velocità o dimensioni, ma del tipo di operazione che si desidera fare ai dati.

Se avete intenzione di fare aderire , sorta , ed altre operazioni DB sui vostri dati per poi andare Sqlite . Un esempio è l'ordinamento dei dati per data.

Se vuoi mappare valori semplici (come int, booleano, String), usa Preferenze . Le operazioni DB non funzioneranno qui e non c'è bisogno di dire che devi avere tutte le chiavi. Un esempio è la password dell'utente o la configurazione dell'app.

La grande tentazione di abbracciare le Preferenze è quando si desidera utilizzarlo per memorizzare un POJO appiattito (un oggetto JSON serializzato) come String. Avere tale necessità è in realtà il segno per usare Sqlite. Perché ? Perché dati complessi alla fine avranno bisogno di complicazioni. Immagina di recuperare una voce specifica che potrebbe essere gestita da un semplice "SELEZIONA ... DOVE ID = 1". Nel percorso Preferenze, questo sarà un lungo processo dalla deserializzazione all'iterazione dei risultati.


Inoltre, SharedPreferences non supporta le transazioni, quindi se hai bisogno di transazioni usa SQLite. Ad esempio, se l'utente preme un pulsante "Esci", è possibile che si desideri cancellare più SharedPreferenceschiavi / valori contemporaneamente (ad es. Entrambi i tasti usere password), in modo da essere sicuri che entrambi i tasti non siano impostati o entrambi impostati.
Runeks,

5
  • Per archiviare enormi quantità di dati, scegli il sistema di database SQLite. Ciò consentirà all'utente di cercare anche dati.

  • D'altra parte, per archiviare una piccola quantità di dati, selezionare Preferenze condivise. In questo caso, non è necessario un enorme sistema di database. Ciò consentirà all'utente di salvare semplicemente i dati e caricarli.


1
300 coppie chiave-valore sono un'enorme quantità di dati? Devo memorizzarlo esattamente.
JCarlosR,

1
In tal caso, dovresti andare per il database SQLite. Altrimenti, sarà difficile gestire e recuperare quei 300 dati.
Sami Al-Jabar

Ma se si conoscono tutte le chiavi non sarà più semplice recuperare i dati dalle Preferenze condivise?
Arjun,

-6

Dimentica SQLLite dimentica SharedPreferences, usa Realm. Un'unica soluzione per tutto il tuo archivio locale. È possibile utilizzare semplicemente vecchi oggetti Java come RealmObjects e archiviare i dati lì. È possibile convertire le query selezionate in file JSON. Non è necessario analizzare l'intero database. Controlla questo link: https://realm.io/news/introducing-realm/


12
dimentica tutto ciò che sai di slipcovers.
Andrew G,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.