sql >> Databasteknik >  >> RDS >> SQLite

Hur man cachelagrar Parsed JSON för offlineanvändning

Varför inte bara spara den i cachemappen i din app med något sånt här:

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

Och efter det kan du läsa den när som helst med:

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

UPPDATERING: Okej, skapa en klass som heter ObjectToFileUtil, klistra in den här koden i den skapade klassen

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

Ändra till ditt paketnamn och glöm inte att lägga till WRITE_EXTERNAL_STORAGE behörighet till AndroidManifest.xml . Lägg till fältet i MainActivity

private String dataPath;

och ersätt din onPostExecute-metod för klassen JSONAsyncTask till

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

Nu kan du få åtkomst till get actorsList från File när du vill, genom att använda

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

Om du vill spara sökvägen till filen efter att du har stängt programmet måste du spara dataPath-strängen (och ladda när programmet startar), till exempel genom att använda SharedPreferences.



  1. Gruppera flera valda uttalanden när du anropar Oracle från ADO.NET

  2. Oracle tar inte bort markörer efter stängning av resultatuppsättningen

  3. Ingen mer data att läsa från uttaget fel

  4. Oracle:spelar kolumnordningen någon roll i ett index?