sql >> Database >  >> RDS >> SQLite

Geparseerde JSON cachen voor offline gebruik

Waarom slaat u het niet gewoon op in de cachemap van uw app met zoiets als dit:

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

En daarna kunt u het op elk gewenst moment lezen met:

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

UPDATE: Oké, maak een klasse met de naam ObjectToFileUtil, plak deze code in de gemaakte klasse

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

Wijzig in uw pakketnaam en vergeet niet WRITE_EXTERNAL_STORAGE toe te voegen toestemming voor AndroidManifest.xml . In uw MainActivity-toevoegveld

private String dataPath;

en vervang uw onPostExecute-methode van de JSONAsyncTask-klasse door

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 kunt u op elk moment en wanneer u maar wilt toegang krijgen tot actorenlijst uit bestand, door gebruik te maken van

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

Als u het pad van het bestand wilt opslaan nadat u de toepassing hebt gesloten, moet u de dataPath-tekenreeks opslaan (en laden bij het starten van de toepassing), bijvoorbeeld met SharedPreferences.



  1. een waarde van een variabele afdrukken in postgresql

  2. “Is het geheim? Is het veilig?" Omgaan met gevoelige gegevens in uw gegevensmodellering

  3. Barman Cloud – Deel 2:Cloudback-up

  4. Hoe een kolom in SQL te verwijderen