2013-09-12 2 views
2

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

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

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

+0

вы не должны кэшировать данные, используя «SharedPreferences», вы должны кэшировать их с помощью файлов в каталоге кеша приложений! –

+0

Какие файлы? Дайте мне больше информации об этом, пожалуйста? @MoshErsan –

+1

«Какие файлы?» - поскольку у вас есть JSON, можно предположить, что файл JSON был бы уместным. – CommonsWare

ответ

2

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

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

увидеть этот код:

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

0

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

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

Смежные вопросы