2016-01-31 27 views
5

Quale è l'alternativa migliore per Shared Preferences in Android per memorizzare i dati, Se voglio Leggere i dati e salvarlo di nuovo con alcune modifiche. I dati possono essere il profilo di un utente, una risposta JSON o qualsiasi oggetto. Mentre immagazzino molti dati, sto cercando un'altra opzione meno dispendiosa in termini di tempo per i dati Reda/Write. Attualmente la mia app impiega x millisecondi per passare dall'attività A all'attività B. Posso ridurre questa volta?Qual è l'alternativa migliore per le preferenze condivise in Android?

+0

Si prega di spiegare, nel dettaglio, quali "Speedy/transazioni sicure" si intende, e chiarire come 'SharedPreferences' non soddisfa le vostre esigenze. – CommonsWare

+0

@CommonsWare ha elaborato le mie domande –

risposta

0

Non riesco a trovare un modo migliore per salvare i dati dell'utente. SharedPreferences è stato creato esattamente per questo scopo. E SharedPreferences non dovrebbe impedire il caricamento delle attività. Quindi potrebbe esserci qualcos'altro che riduce la tua performance.

1

Se vi sono molti dati che si desidera memorizzare, non utilizzare le preferenze condivise, in quanto può creare problemi. Invece, dovresti scrivere nella memoria interna. Ecco le opzioni:

**Shared Preferences** 
Store private primitive data in key-value pairs. 
**Internal Storage** 
Store private data on the device memory. 
**External Storage** 
Store public data on the shared external storage. 
**SQLite Databases** 
Store structured data in a private database. 
**Network Connection** 
Store data on the web with your own network server. 

Gli ultimi tre sono i più difficili, ma i primi due sono molto facili. Ecco come memorizzare nella memoria interna, se si dispone di troppi dati nelle preferenze condivise:

Nota: quando l'utente disinstalla l'applicazione, questi file vengono rimossi. Dal docs:

Per creare e scrivere un file privato alla memoria interna:

1. Chiamare openFileOutput() con il nome del file e la modalità di funzionamento .

2. Restituisce un FileOutputStream.

3. Scrivere nel file con write().

4. Chiudere lo stream con close().

Ad esempio:

String FILENAME = "hello_file"; 
String string = "hello world!"; 

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); 
fos.write(string.getBytes()); 
fos.close(); 

Recupero dei dati è anche molto semplice:

1. Chiamare openFileInput() e passare il nome del file da leggere. Questo restituisce un FileInputStream.

2. Leggere i byte dal file con read().

3. Quindi chiudere lo stream con close().

preferenze condivise è buono per memorizzare semplici coppie chiave valore come i punteggi più alti, le impostazioni utente, ecc Se si desidera salvare un saggio che l'utente ha digitato, magari utilizzare storage esterno o interno.

Fatemi sapere se questo ha aiutato,

Ruchir

15

E 'molto difficile consigliare qualsiasi cosa senza una profonda conoscenza del caso d'uso.

  • Se si desidera memorizzare alcuni dati di preferenza utente - SharedPreferences potrebbe essere una buona scelta.
  • Se si desidera memorizzare i dati di autenticazione, come i token di autenticazione degli utenti, non utilizzare SharedPreferences e dare un'occhiata a AccountManager.
  • Se si desidera archiviare dati aziendali, ad es. più entità aziendali, che mantengono alcune relazioni tra loro, si desidera poterle interrogare e/o modificarle. Ti consiglio di utilizzare Realm - https://realm.io. L'alternativa è usare SQLite ma nella mia opinione molto soggettiva, il regno è molto più facile da iniziare.
  • Se si desidera memorizzare solo alcune risposte basate su JSON, osservare i meccanismi di memorizzazione nella cache forniti dal client HTTP. OkHttp per esempio ha un buon supporto per questo.

Parlare di tempo di caricamento - SharedPreferences è piuttosto veloce in generale, ma dipende molto da come lo si utilizza. Se si memorizzano grandi strutture JSON in esso, quindi leggerlo completamente solo per trovare qualche oggetto specifico basato su id - ovviamente ci vorrà più tempo rispetto all'utilizzo di un vero database per questo.

Tenete presente che tutte le soluzioni che ho proposto (AccountManager, SharedPreferences e SQLite/Realm) possono funzionare perfettamente l'una con l'altra in un'unica app. Assicurati di scegliere lo strumento adatto per un determinato problema.

+0

Il realm è protetto per l'archiviazione dei token di autorizzazione? –

0

Se siete alla ricerca di Allucinante alternativa di pericoli backup automatico C'è un modo per escludere SharedPrefs specifici che si usa da funzionalità di backup automatico - Si ottiene dichiarando esclude i tag in un file XML e quindi facendo riferimento utilizzando l'attributo android: fullBackupContent sotto il tag dell'applicazione del tuo manifest. In questo modo puoi ancora supportare la funzione di backup automatico senza preoccuparti delle informazioni riservate archiviate nel cloud di Google Drive.

Buone referenze: https://developer.android.com/guide/topics/data/autobackup.html https://www.youtube.com/watch?v=HXacyy0HSW0