SQLite
 sql >> Baza danych >  >> RDS >> SQLite

Jak buforować przeanalizowany JSON do użytku w trybie offline

Dlaczego nie po prostu zapisać go w folderze pamięci podręcznej swojej aplikacji, używając czegoś takiego:

String path = Environment.getExternalStorageDirectory() + File.separator + "cache" + File.separator;
File dir = new File(path);
if (!dir.exists()) {
    dir.mkdirs();
}
path += "data";
File data = new File(path);
if (!data.createNewFile()) {
    data.delete();
    data.createNewFile();
}
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(data));
objectOutputStream.writeObject(actorsList);
objectOutputStream.close();

A potem możesz go przeczytać w dowolnym momencie, używając:

List<?> list = null;
File data = new File(path);
try {
    if(data.exists()) {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(data));
        list = (List<Object>) objectInputStream.readObject();
        objectInputStream.close();
    }
} catch (IOException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

AKTUALIZACJA: OK, stwórz klasę o nazwie ObjectToFileUtil, wklej ten kod do utworzonej klasy

package <yourpackagehere>;

import android.os.Environment;

import java.io.*;

public class ObjectToFileUtil {

    public static String objectToFile(Object object) throws IOException {
        String path = Environment.getExternalStorageDirectory() + File.separator + "cache" + File.separator;
        File dir = new File(path);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        path += "data";
        File data = new File(path);
        if (!data.createNewFile()) {
            data.delete();
            data.createNewFile();
        }
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(data));
        objectOutputStream.writeObject(object);
        objectOutputStream.close();
        return path;
    }

    public static Object objectFromFile(String path) throws IOException, ClassNotFoundException {
        Object object = null;
        File data = new File(path);
        if(data.exists()) {
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(data));
            object = objectInputStream.readObject();
            objectInputStream.close();
        }
        return object;
    }
}

Zmień na nazwę swojego pakietu i nie zapomnij dodać WRITE_EXTERNAL_STORAGE pozwolenie na AndroidManifest.xml . W polu dodawania MainActivity

private String dataPath;

i zamień metodę onPostExecute klasy JSONAsyncTask na

protected void onPostExecute(Boolean result) {
    dialog.cancel();
    adapter.notifyDataSetChanged();
    if(result) {
        try {
            dataPath = objectToFile(arrayList);
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show();
    }
}

Teraz możesz uzyskać dostęp do listy aktorów z pliku w dowolnym momencie, używając

try {
    actorsList = (ArrayList<Actors>)objectFromFile(dataPath);
} catch (IOException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

Jeśli chcesz zachować ścieżkę do pliku po zamknięciu aplikacji, musisz zapisać ciąg dataPath (i załadować przy starcie aplikacji), na przykład za pomocą SharedPreferences.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 3 sposoby na zastąpienie NULL przez „N/A” w SQLite

  2. Zamów SQLite według

  3. onCreate() funkcji RoomDatabase.Callback() nie został wywołany po pomyślnym wywołaniu funkcji .build()

  4. SQLite CROSS JOIN z praktycznym przykładem

  5. ListView nie pokazuje poprawnych obrazów, które można rysować zgodnie z ich nazwą w sqlite