2013-08-29 21 views
11

Moja aplikacja powinna działać nie tylko w trybie online, ale także w trybie offline. Z tego powodu rozważam znalezienie najlepszego sposobu na gromadzenie danych. Nie lubię używać SharedPreference do przechowywania danych, ale w dokumentacji do androida Maksymalny rozmiar w znakach dozwolonych dla wartości preferencji to 8192. Nie wiem, czy to w porządku, czy nie? Próbowałem zrezygnować z tego pomysłu, próbując wykorzystać wypłatę za pomocą FileCashing lub sqLite.Najlepszy sposób na buforowanie json

Co sądzisz, jaka jest najlepsza funkcja SharedPreference vs FileCashing lub SqLiteCaching?

+1

SharedPreferences dla danych konfiguracyjnych oraz SQLite dla danych masowych. –

+0

Nie można udzielić takiej odpowiedzi, nie znając szczegółów dotyczących przypadku użycia. Nawet wtedy jest to w pewnym stopniu kwestią opinii. – Henry

+1

Załóżmy, że mam pewne dane (tj. Listę miast) Chcę, aby moja aplikacja przechowywała ten json do późniejszego wykorzystania, jeśli połączenie z Internetem nie jest dostępne. – fish40

Odpowiedz

12

Osobiście lubię robić to w następujący sposób. Utwórz bazę danych SQLite, która może przechowywać Twoją zawartość. Następnie należy powiązać interfejs użytkownika bezpośrednio z bazą danych za pomocą Adaptery Dostawców treści, które wysyłają powiadomienie za każdym razem, gdy dane zostaną zmienione, aby interfejs mógł się sam zaktualizować. Ostatnim elementem równania jest jakaś forma usługi synchronizacji, która pobiera zawartość i zapisuje ją do bazy asynchronicznie. W ten sposób możesz łatwo zarządzać swoimi danymi, ponieważ wszystko znajduje się w tym samym miejscu. Jedyną rzeczą, którą musisz wymyślić dla swojej aplikacji, jest to, jak zdecydujesz, kiedy zaktualizować lub usunąć dane z bazy danych.

Adapters

ContentProvider

Synchronization

+0

Zastanawiam się nad kartami i dostawcami treści, w jaki sposób mogę wysyłać powiadomienia? – fish40

+1

ContentProvider powinien wywołać context.getContentResolver(). NotifyChange (, null); kiedy dane zostały zmienione. Aktywność, o której mowa, będzie następnie wykorzystywać ContentObserver do powiadamiania o tych zmianach. – metter

+0

To bardzo dobry punkt. Dziękuję Ci. – fish40

0

W zależności od wymagań polecam bazę danych SQLite.

Ponieważ preferowane preferencje są odpowiednie do przechowywania konfiguracji - często małe dane/ciągi.

Pamięć podręczna plików jest trudna do zarządzania, dlatego polecam SQLite - łatwe w zarządzaniu i możliwość przechowywania danych masowych.

Biorąc pod uwagę wydajność, jeśli liczba indeksu nie jest zbyt duża, baza danych SQLite powinna mieć akceptowalną wydajność. Na przykład. tylko kilka ms wolniej niż pamięć podręczna plików.

Być może będziesz w stanie połączyć te dwa podejścia razem. Użyj pliku dostępu swobodnego z offsetem indeksu przechowywanym w SQLite.

+0

dzięki za odpowiedź. co możesz powiedzieć o wydajności? – fish40

+0

Zobacz moją zredagowaną odpowiedź. – Robin

+0

Dziękuję za wsparcie @robin. – fish40

14

Zapisz json w katalogu pamięci podręcznej jako plik ....

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(); 

Pobierz:

// 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 w ten sam sposób, ale niż usunąć obiekt jsonobject i po prostu zapisać ciąg do pamięci podręcznej. A podczas pobierania wystarczy pobrać ciąg, a nie obiekt JsonObject. – Msmit1993

+0

Po utworzeniu klasy File dwukrotnie podczas pobierania? – Hoffie

0

Użyłem pamięci wewnętrznej który plik przechowuje w pakietu Application katalogów, które nie mogą być dostępne nie zakorzenione urządzenia.

Tutaj klasa, która może tworzyć, czytać i usunąć plik

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(); 
     } 
    } 
} 

Można tworzyć, czytać i usunąć plik wywołując ReadWriteJsonFileUtils metod klasy następująco:

Do tworzenia pliku :

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

Do czytania pliku:

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

do kasowania pojedynczego pliku

new ReadWriteJsonFileUtils(context).deleteFile(file_name); 

na usunięcie wszystkich plików

new ReadWriteJsonFileUtils(context).deleteFile(); 
Powiązane problemy