2013-08-29 15 views
11

La mia applicazione dovrebbe funzionare non solo online ma anche in modalità offline. Per questo motivo sto considerando di trovare il modo migliore per incassare i dati. Mi piace usare SharedPreference per i dati del negozio ma nella documentazione di Android scritta La dimensione massima in caratteri consentita per un valore di preferenze è 8192. Non so che sia ok o no? Ho provato a svenire da questa idea cercando di usare FileCashing o incassare sqLite.Il modo migliore per caching json

Quindi cosa ne pensi ragazzi qual è il migliore SharedPreference vs FileCashing o vs SqLiteCaching?

+1

SharedPreferences per i dati di configurazione, e SQLite per i dati di massa. –

+0

È impossibile rispondere senza conoscere ulteriori dettagli sul tuo caso d'uso. Anche allora, è una questione di opinione in una certa misura. – Henry

+1

Diciamo che ho alcuni dati (la mia lista di città) Voglio che il mio negozio di applicazioni questo json per uso futuro se la connessione internet non è disponibile. – fish40

risposta

12

Personalmente mi piace farlo in questo modo. Creare un database SQLite in grado di contenere il contenuto. Quindi, collegare l'interfaccia utente direttamente al database utilizzando gli adattatori & Content Provider che inviano una notifica ogni volta che i dati vengono modificati in modo che l'interfaccia utente possa aggiornarsi. L'ultima parte dell'equazione è una forma di servizio di sincronizzazione che scarica il contenuto e lo salva nel database in modo asincrono. In questo modo, puoi gestire i tuoi dati molto facilmente perché è tutto nello stesso posto. L'unica parte che dovrai capire per la tua app è come decidi quando aggiornare o rimuovere i dati dal database.

Adapters

ContentProvider

Synchronization

+0

Continuo a pensare ad adattatori e provider di contenuti come posso inviare una notifica? – fish40

+1

Un ContentProvider deve chiamare context.getContentResolver(). NotifyChange (, null); quando i dati sono stati cambiati. L'attività in questione utilizzerà quindi un ContentObserver per ricevere una notifica di tali modifiche. – metter

+0

Questo è un ottimo punto. Grazie. – fish40

0

In base al requisito, desidero raccomandare il database SQLite.

Poiché la preferenza condivisa è adatta per la memorizzazione della configurazione, spesso piccoli dati/stringhe.

La cache dei file è difficile da gestire, quindi consiglio SQLite: facile da gestire e possibilità di memorizzare i dati di massa.

Considerando le prestazioni, se il numero di indice non è così elevato, il database SQLite dovrebbe avere le prestazioni accettabili. Per esempio. solo alcuni ms più lenti di una cache di file.

Potrebbe essere possibile combinare questi due approcci insieme. Utilizzare un file di accesso casuale con offset dell'indice memorizzato in SQLite.

+0

grazie per la tua risposta. cosa puoi dire delle prestazioni? – fish40

+0

Vedere la mia risposta modificata. – Robin

+0

Grazie per il supporto @robin. – fish40

14

Salvare il JSON nella cartella della cache come file di ....

Save:

// Instantiate a JSON object from the request response 
JSONObject jsonObject = new JSONObject(json); 
// Save the JSONOvject 
ObjectOutput out = new ObjectOutputStream(new FileOutputStream(new File(getCacheDir(),"")+"cacheFile.srl")); 
out.writeObject(jsonObject); 
out.close(); 

Recupera:

// Load in an object 
ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File(new File(getCacheDir(),"")+"cacheFile.srl"))); 
JSONObject jsonObject = (JSONObject) in.readObject(); 
in.close(); 
+3

@ Cristiana214 Stesso modo di rimuovere l'istanza jsonobject e basta scrivere la stringa nella cache. E quando si recupera, basta recuperare una stringa e non un oggetto Json. – Msmit1993

+0

Perché hai creato la classe File due volte durante il recupero? – Hoffie

0

ho usato Storage interno quale file conservare in pacchetto applicativo directory che non possono essere accessibili da dispositivo non radicata.

Qui la classe che può creare, leggere e cancellare il file

public class ReadWriteJsonFileUtils { 
    Activity activity; 
    Context context; 

    public ReadWriteJsonFileUtils(Context context) { 
     this.context = context; 
    } 

    public void createJsonFileData(String filename, String mJsonResponse) { 
     try { 
      File checkFile = new File(context.getApplicationInfo().dataDir + "/new_directory_name/"); 
      if (!checkFile.exists()) { 
       checkFile.mkdir(); 
      } 
      FileWriter file = new FileWriter(checkFile.getAbsolutePath() + "/" + filename); 
      file.write(mJsonResponse); 
      file.flush(); 
      file.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public String readJsonFileData(String filename) { 
     try { 
      File f = new File(context.getApplicationInfo().dataDir + "/new_directory_name/" + filename); 
      if (!f.exists()) { 
       onNoResult(); 
       return null; 
      } 
      FileInputStream is = new FileInputStream(f); 
      int size = is.available(); 
      byte[] buffer = new byte[size]; 
      is.read(buffer); 
      is.close(); 
      return new String(buffer); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     onNoResult(); 
     return null; 
    } 

    public void deleteFile() { 
     File f = new File(context.getApplicationInfo().dataDir + "/new_directory_name/"); 
     File[] files = f.listFiles(); 
     for (File fInDir : files) { 
      fInDir.delete(); 
     } 
    } 

    public void deleteFile(String fileName) { 
     File f = new File(context.getApplicationInfo().dataDir + "/new_directory_name/" + fileName); 
     if (f.exists()) { 
      f.delete(); 
     } 
    } 
} 

È possibile creare, leggere e cancellare il file chiamando ReadWriteJsonFileUtils metodi di classe come segue:

Per la creazione del file :

try { 
    new ReadWriteJsonFileUtils(context).createJsonFileData(file_name, data); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Per la lettura di file:

String jsonString = new ReadWriteJsonFileUtils(context).readJsonFileData(file_name); 

per l'eliminazione di file singolo

new ReadWriteJsonFileUtils(context).deleteFile(file_name); 

per l'eliminazione di tutti i file

new ReadWriteJsonFileUtils(context).deleteFile(); 
Problemi correlati