Лучший способ кэширования json

мое приложение должно работать не только в онлайн но и в оффлайн режиме. По этой причине я рассматриваю возможность найти лучший способ обналичивания данных. Мне не нравится использовать SharedPreference для хранения данных, но в документации android максимальный размер символов, разрешенных для значения настроек, составляет 8192. Я не знаю, нормально это или нет? Я попытался выйти из этой идеи, пытаясь использовать FileCashing или SQLite cashing.

Итак, что вы думаете, ребята, что такое лучший SharedPreference vs FileCashing или против SqLiteCaching?

4 ответов


Мне лично нравится делать это следующим образом. Создайте базу данных SQLite, которая может содержать содержимое. Затем свяжите пользовательский интерфейс непосредственно с базой данных с помощью адаптеров и поставщиков контента, которые отправляют уведомления при каждом изменении данных, чтобы пользовательский интерфейс мог обновляться. Последняя часть уравнения представляет собой некоторую форму службы синхронизации, которая загружает содержимое и асинхронно сохраняет его в базе данных. Таким образом, вы можете управлять своими данными очень легко, потому что все это то же место. Единственное, что вам нужно выяснить для вашего приложения, - это как вы решаете, когда обновлять или удалять данные из базы данных.

переходник

ContentProvider

синхронизация


сохраните json в каталоге кэша как файл....

сохранить:

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

извлечь:

// Load in an object
ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File(new File(getCacheDir(),"")+"cacheFile.srl")));
JSONObject jsonObject = (JSONObject) in.readObject();
in.close();

основываясь на вашем требовании, я бы рекомендовал базу данных SQLite.

поскольку общие предпочтения подходят для хранения конфигурации-часто небольшие данные / строки.

кэш файлов трудно управлять, поэтому я рекомендую SQLite-простота управления и возможность хранения массовых данных.

учитывая производительность, если количество индексов не так велико, база данных SQLite должна иметь приемлемую производительность. Е. Г. только несколько МС медленнее, чем файл кэш.

вы могли бы объединить эти два подхода вместе. Используйте файл произвольного доступа со смещением индекса, хранящимся в SQLite.


я использовал Внутренний Накопитель, которые хранят файл в пакета прикладных программ каталог, который не может быть доступен не корневым устройством.

вот класс, который может создавать, читать и удалять файл

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

вы можете создать, прочитать и удалить файл, позвонив ReadWriteJsonFileUtils методы класса следующим образом:

для создания файла:

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

для чтения файл:

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

для удаления одного файла

new ReadWriteJsonFileUtils(context).deleteFile(file_name);

для удаления файла

new ReadWriteJsonFileUtils(context).deleteFile();