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

Я использую 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();
}

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


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


Ответы (3)


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

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

см. этот код:

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.

person Mohammad Ersan    schedule 12.09.2013

Я использовал идею @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;
}

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

person Batuhan Coşkun    schedule 17.09.2013