use*_*813 18 android sharedpreferences
我想使用SharedPreferences保存/调用整数数组,这可能吗?
Ego*_*gor 48
您可以尝试这样做:
将整数放入一个字符串中,用字符分隔每个int,例如逗号,然后将它们保存为字符串:
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
int[] list = new int[10];
StringBuilder str = new StringBuilder();
for (int i = 0; i < list.length; i++) {
str.append(list[i]).append(",");
}
prefs.edit().putString("string", str.toString());
Run Code Online (Sandbox Code Playgroud)获取字符串并使用StringTokenizer解析它:
String savedString = prefs.getString("string", "");
StringTokenizer st = new StringTokenizer(savedString, ",");
int[] savedList = new int[10];
for (int i = 0; i < 10; i++) {
savedList[i] = Integer.parseInt(st.nextToken());
}
Run Code Online (Sandbox Code Playgroud)Raf*_*l T 14
你不能把Arrays放在SharedPreferences中,但是你可以解决:
private static final String LEN_PREFIX = "Count_";
private static final String VAL_PREFIX = "IntValue_";
public void storeIntArray(String name, int[] array){
SharedPreferences.Editor edit= mContext.getSharedPreferences("NAME", Context.MODE_PRIVATE).edit();
edit.putInt(LEN_PREFIX + name, array.length);
int count = 0;
for (int i: array){
edit.putInt(VAL_PREFIX + name + count++, i);
}
edit.commit();
}
public int[] getFromPrefs(String name){
int[] ret;
SharedPreferences prefs = mContext.getSharedPreferences("NAME", Context.MODE_PRIVATE);
int count = prefs.getInt(LEN_PREFIX + name, 0);
ret = new int[count];
for (int i = 0; i < count; i++){
ret[i] = prefs.getInt(VAL_PREFIX+ name + i, i);
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
这是我的版本,基于Egor的回答.我不想使用StringBuilder,除非我正在构建一个令人兴奋的字符串,但感谢Egor使用StringTokenizer - 过去没有太多使用它,但它非常方便!仅供参考,这是我的Utility类:
public static void saveIntListPrefs(
String name, Activity activity, List<Integer> list)
{
String s = "";
for (Integer i : list) {
s += i + ",";
}
Editor editor = activity.getPreferences(Context.MODE_PRIVATE).edit();
editor.putString(name, s);
editor.commit();
}
public static ArrayList<Integer> readIntArrayPrefs(String name, Activity activity)
{
SharedPreferences prefs = activity.getPreferences(Context.MODE_PRIVATE);
String s = prefs.getString(name, "");
StringTokenizer st = new StringTokenizer(s, ",");
ArrayList<Integer> result = new ArrayList<Integer>();
while (st.hasMoreTokens()) {
result.add(Integer.parseInt(st.nextToken()));
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
两种解决方案:
(1)使用http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html
它具有拆分/连接函数,可让您在一个衬垫中连接和拆分整数:
StringUtils.join([1, 2, 3], ';') = "1;2;3"
StringUtils.split("1;2;3", ';') = ["1", "2", "3"]
Run Code Online (Sandbox Code Playgroud)
不过,您仍然需要将字符串转换回整数。
实际上,拆分java.lang.String.split()也同样有效:
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)
(2) 使用 SharedPreferences.putStringSet() (API 11):
SharedPreferences.Editor editor = preferences.edit();
int count = this.intSet.size();
if (count > 0) {
Set<String> theSet = new HashSet<String>();
for (Long l : this.intSet) {
theSet.add(String.valueOf(l));
}
editor.putStringSet(PREFS_KEY, theSet);
} else {
editor.remove(PREFS_KEY);
}
editor.commit();
Run Code Online (Sandbox Code Playgroud)
并把它找回来:
Set<String> theSet = this.preferences.getStringSet(PREFS_KEY, null);
if (theSet != null && !theSet.isEmpty()) {
this.intSet.clear();
for (String s : theSet) {
this.intSet.add(Integer.valueOf(s));
}
}
Run Code Online (Sandbox Code Playgroud)
此代码不会捕获 NPE 或 NumberFormatExceptions,因为 intSet 可以确保不包含任何空值。但当然,如果你不能确保在你的代码中你应该用 try/catch 包围它。
| 归档时间: |
|
| 查看次数: |
26679 次 |
| 最近记录: |