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

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

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

Ответ 1

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

Адаптеры

ContentProvider

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

Ответ 2

Сохраните 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();

Ответ 3

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

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

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

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

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

Ответ 4

Я использовал Внутреннее хранилище, которое хранит файл в каталоге Application package, недоступном для некорневого устройства.

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

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