Miglior modo per memorizzare i dati in Android

Ho un ArrayList di oggetti personalizzati e semplici da Serializable che vorrei memorizzare nel disco e leggere sul riavvio. I miei dati sono molto piccoli, circa 25 oggetti e al massimo 5 elenchi quindi penso che SQLite sarebbe overkill. Nel mondo iPhone vorrei usare NSKeyedArchiver e NSKeyedUnarchiver che funziona bene. Su Android ho cercato di farlo con un FileOutputStream e ObjectOutputStream e mentre il risultato è lo stesso, le performance sono terribili. C'è un modo migliore per leggere piccoli oggetti nel file system in Android?

  • Come get l'indirizzo di un progetto SMS
  • Come get i dettagli degli utenti dopo l'accesso efficace tramite Facebook
  • Non posso trovare il file che ho creato su tablet Android
  • adb logcat: Aumenta la lunghezza massima del messaggio
  • parseSdkContent fallito Imansible inizializzare la class android.graphics.Typeface
  • Problema Intent.ACTION_CALL (SecurityException)
  • 4 Solutions collect form web for “Miglior modo per memorizzare i dati in Android”

    Per quello che vale la pena cache alcuni dei miei dati String su disco utilizzando BufferedWriter / BufferedReader ed è molto veloce. La materia è più veloce di memorizzare gli stessi dati in SharedPreferences. Il codice è qualcosa di simile (nota che le cose accadono più velocemente quando si fornisce una dimensione del buffer)

     final BufferedWriter out = new BufferedWriter(new FileWriter(file), 1024); out.write(stuff); out.close(); 
     public class MyClass implements Serializable { private static final long serialVersionUID = 1L; public String title; public String startTime; public String endTime; public String day; public boolean classEnabled; public MyClass(String title, String startTime, boolean enable) { this.title = title; this.startTime = startTime; this.classEnabled = enable; } public boolean saveObject(MyClass obj) { final File suspend_f=new File(SerializationTest.cacheDir, "test"); FileOutputStream fos = null; ObjectOutputStream oos = null; boolean keep = true; try { fos = new FileOutputStream(suspend_f); oos = new ObjectOutputStream(fos); oos.writeObject(obj); } catch (Exception e) { keep = false; } finally { try { if (oos != null) oos.close(); if (fos != null) fos.close(); if (keep == false) suspend_f.delete(); } catch (Exception e) { /* do nothing */ } } return keep; } public MyClass getObject(Context c) { final File suspend_f=new File(SerializationTest.cacheDir, "test"); MyClass simpleClass= null; FileInputStream fis = null; ObjectInputStream is = null; try { fis = new FileInputStream(suspend_f); is = new ObjectInputStream(fis); simpleClass = (MyClass) is.readObject(); } catch(Exception e) { String val= e.getMessage(); } finally { try { if (fis != null) fis.close(); if (is != null) is.close(); } catch (Exception e) { } } return simpleClass; } 

    e chiamando da attività

      if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"MyCustomObject"); else cacheDir= getCacheDir(); if(!cacheDir.exists()) cacheDir.mkdirs(); MyClass m = new MyClass("umer", "asif", true); boolean result = m.saveObject(m); if(result) Toast.makeText(this, "Saved object", Toast.LENGTH_LONG).show(); else Toast.makeText(this, "Error saving object", Toast.LENGTH_LONG).show(); MyClass m = new MyClass(); MyClass c = m.getObject(this); if(c!= null) Toast.makeText(this, "Retrieved object", Toast.LENGTH_LONG).show(); else Toast.makeText(this, "Error retrieving object", Toast.LENGTH_LONG).show(); 

    non dimenticare di utilizzare le autorizzazioni write_external_storage nel file manifesto.

    È difficile sapere senza profilare, ma la mia ipotesi è che la tua scarsa performance è giù per utilizzare ObjectOutputStream . Avete provato a scrivere i propri writeObject(ObjectOutputStream) e readObject(ObjectOutputStream) quanto ciò potrebbe aiutare le performance.

    È ansible utilizzare lo strumento di traceview per vedere esattamente where l'applicazione è in esecuzione lenta. Date un'occhiata a questa domanda per istruzioni su come utilizzare il traceview .

    Questa libreria potrebbe aiutarti:

    http://github.com/afollestad/Silk (modifica: non più disponibile)

    Vedere SilkCacheManager e SilkCachedFeedFragment / SilkLastUpdatedFragment.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.