Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как получить размер данных SharedPreferences, возможно ли это?

Автор вопроса: Batuhan CoşkunОтветов: 3

Я использую SharedPreferences для сохранения JSONArray, а затем использую его, когда у меня нет подключения к Интернету. Я должен проверить размер сохраненных данных, потому что мне не нужны большие данные. Я использую для этого четкий метод, но я хочу быть уверенным в этом, контролируя размер. Мои функции для сохранения и загрузки и очистки;

public static void saveJSONArray(Context c, String prefName, String key, JSONArray array) {
    SharedPreferences settings = c.getSharedPreferences(prefName, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString(key, array.toString());
    editor.commit();
}

public static JSONArray loadJSONArray(Context c, String prefName, String key) throws JSONException {
    SharedPreferences settings = c.getSharedPreferences(prefName, 0);
    return new JSONArray(settings.getString(key, ""));
}

public static void clearPrefs(Context c, String prefName){
    SharedPreferences settings = c.getSharedPreferences(prefName, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.clear();
    editor.commit();
}

Эта функция работает правильно. Нет проблем. Но мне нужна еще одна функция, которая возвращает размер всех данных. Я исследовал это, но не смог найти никакого решения. Заранее спасибо.

  • вы не должны кэшировать данные с помощью SharedPreferences, вы должны кэшировать их с помощью файлов в каталоге кеша вашего приложения! Mohammad Ersan 12.09.2013
  • Какие файлы? Дайте мне больше информации об этом, пожалуйста. @MoshErsan Batuhan Coşkun 12.09.2013
  • Какие файлы? - поскольку у вас есть JSON, можно подумать, что подойдет файл JSON. CommonsWare 12.09.2013
  • Итак, вы говорите, что я должен сохранить файл json во внутреннем или внешнем хранилище? Batuhan Coşkun 12.09.2013

androidsharedpreferences

Ответы

Ответ 1 · рейтинг 3 · Andy Res

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

String data = array.toString();
byte[] byteArray = data.getBytes("UTF-8");
long size = byteArray.length;

Ответ 2 · рейтинг 3 · Mohammad Ersan

см. этот код:

public void cacheData(String data, String name) throws IOException {

    File dataFile = new File(getCacheDir(), name.concat(".json"));
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(
            new FileOutputStream(dataFile));
    objectOutputStream.writeUTF(data);
    objectOutputStream.close();

}

public String readData(String name) throws IOException {

    File dataFile = new File(getCacheDir(), name.concat(".json"));
    if (!dataFile.exists()) {
        return null;
    }

    ObjectInputStream objectInputStream = new ObjectInputStream(
            new FileInputStream(dataFile));
    String data = objectInputStream.readUTF();
    objectInputStream.close();

    return data;
}

public long getDataLength(String name){

    File dataFile = new File(getCacheDir(), name.concat(".json"));
    if (!dataFile.exists()) {
        return 0;
    }
    return dataFile.length();
}

поскольку мы сохраняем ваши данные с использованием "UTF-8", длина данных может отличаться от другого кода, например cp1256.

Ответ 3 · рейтинг 1 · Batuhan Coşkun

Я использовал идею @AndyRes и создал функцию с именем sizeOfSharedPrefs;

public static long sizeOfSharedPrefs(Context c, String prefName, String command){
    SharedPreferences settings = c.getSharedPreferences(prefName, 0);
    String data = settings.getString(command, "").toString();
    byte[] byteArray = null;
    try {
        byteArray = data.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return byteArray.length;
}

Он отлично работает с другими моими функциями.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы