나는이 ArrayList
이름과 아이콘 포인터를 가지고있는 개체를 나는 그것을에서 저장할 SharedPreferences
. 어떻게 할 수 있습니까?
참고 : 데이터베이스를 사용하고 싶지 않습니다.
답변
그래서 데이터 저장소 의 안드로이드 개발자 사이트에서 :
사용자 기본 설정
공유 기본 설정 은 사용자가 선택한 벨소리와 같은 “사용자 기본 설정”을 저장하기위한 것이 아닙니다 . 애플리케이션에 대한 사용자 기본 설정을 만드는 데 관심이있는 경우 자동으로 유지되는 (공유 기본 설정 사용) 사용자 기본 설정을 만들 수있는 활동 프레임 워크를 제공하는 PreferenceActivity를 참조하세요.
그래서 그냥 지속되는 키-값 쌍이기 때문에 괜찮다고 생각합니다.
원래 포스터에게 이것은 그렇게 어렵지 않습니다. 배열 목록을 반복하고 항목을 추가하기 만하면됩니다. 이 예제에서는 단순성을 위해 맵을 사용하지만 배열 목록을 사용하고 적절하게 변경할 수 있습니다.
// my list of names, icon locations
Map<String, String> nameIcons = new HashMap<String, String>();
nameIcons.put("Noel", "/location/to/noel/icon.png");
nameIcons.put("Bob", "another/location/to/bob/icon.png");
nameIcons.put("another name", "last/location/icon.png");
SharedPreferences keyValues = getContext().getSharedPreferences("name_icons_list", Context.MODE_PRIVATE);
SharedPreferences.Editor keyValuesEditor = keyValues.edit();
for (String s : nameIcons.keySet()) {
// use the name as the key, and the icon as the value
keyValuesEditor.putString(s, nameIcons.get(s));
}
keyValuesEditor.commit()
키-값 쌍을 다시 읽으려면 비슷한 작업을 수행합니다. 이것이 작동하는지 알려주십시오.
업데이트 : API 레벨 11 이상을 사용 하는 경우 문자열 세트를 작성 하는 방법 이 있습니다.
답변
API 수준에 관계없이 SharedPreferences에서 문자열 배열 및 개체 배열을 확인 합니다.
어레이 저장
public boolean saveArray(String[] array, String arrayName, Context mContext) {
SharedPreferences prefs = mContext.getSharedPreferences("preferencename", 0);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt(arrayName +"_size", array.length);
for(int i=0;i<array.length;i++)
editor.putString(arrayName + "_" + i, array[i]);
return editor.commit();
}
로드 어레이
public String[] loadArray(String arrayName, Context mContext) {
SharedPreferences prefs = mContext.getSharedPreferences("preferencename", 0);
int size = prefs.getInt(arrayName + "_size", 0);
String array[] = new String[size];
for(int i=0;i<size;i++)
array[i] = prefs.getString(arrayName + "_" + i, null);
return array;
}
답변
쓰기,
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(this);
JSONArray jsonArray = new JSONArray();
jsonArray.put(1);
jsonArray.put(2);
Editor editor = prefs.edit();
editor.putString("key", jsonArray.toString());
System.out.println(jsonArray.toString());
editor.commit();
읽다,
try {
JSONArray jsonArray2 = new JSONArray(prefs.getString("key", "[]"));
for (int i = 0; i < jsonArray2.length(); i++) {
Log.d("your JSON Array", jsonArray2.getInt(i)+"");
}
} catch (Exception e) {
e.printStackTrace();
}
답변
공유 환경 설정 은 API 레벨 11에서 getStringSet
및 putStringSet
메소드를 도입 했지만 이전 버전의 Android (여전히 인기)와 호환되지 않으며 문자열 세트로 제한됩니다.
Android는 더 나은 방법을 제공하지 않으며 저장 및로드를 위해 맵과 배열을 반복하는 것은 특히 배열의 경우 매우 쉽고 깔끔하지 않습니다. 그러나 더 나은 구현은 그렇게 어렵지 않습니다.
package com.example.utils;
import org.json.JSONObject;
import org.json.JSONArray;
import org.json.JSONException;
import android.content.Context;
import android.content.SharedPreferences;
public class JSONSharedPreferences {
private static final String PREFIX = "json";
public static void saveJSONObject(Context c, String prefName, String key, JSONObject object) {
SharedPreferences settings = c.getSharedPreferences(prefName, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString(JSONSharedPreferences.PREFIX+key, object.toString());
editor.commit();
}
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(JSONSharedPreferences.PREFIX+key, array.toString());
editor.commit();
}
public static JSONObject loadJSONObject(Context c, String prefName, String key) throws JSONException {
SharedPreferences settings = c.getSharedPreferences(prefName, 0);
return new JSONObject(settings.getString(JSONSharedPreferences.PREFIX+key, "{}"));
}
public static JSONArray loadJSONArray(Context c, String prefName, String key) throws JSONException {
SharedPreferences settings = c.getSharedPreferences(prefName, 0);
return new JSONArray(settings.getString(JSONSharedPreferences.PREFIX+key, "[]"));
}
public static void remove(Context c, String prefName, String key) {
SharedPreferences settings = c.getSharedPreferences(prefName, 0);
if (settings.contains(JSONSharedPreferences.PREFIX+key)) {
SharedPreferences.Editor editor = settings.edit();
editor.remove(JSONSharedPreferences.PREFIX+key);
editor.commit();
}
}
}
이제이 다섯 가지 방법을 사용하여 공유 기본 설정에 컬렉션을 저장할 수 있습니다. 작업 JSONObject
하고하는 것은 JSONArray
매우 쉽습니다. 당신은 사용할 수 있습니다 JSONArray (Collection copyFrom)
a를 공공 생성자를 JSONArray
자바의 수집 및 이용 아웃 JSONArray
의 get
요소에 액세스하는 방법.
공유 환경 설정에는 크기 제한이 없으므로 (기기의 저장 용량 제한 외에) 이러한 방법은 앱의 일부 컬렉션을 빠르고 쉽게 저장하려는 대부분의 일반적인 경우에 사용할 수 있습니다. 하지만 여기에서 JSON 파싱이 발생하고 Android의 환경 설정은 내부적으로 XML로 저장되므로 메가 바이트의 데이터를 처리 할 때 다른 영구 데이터 저장소 메커니즘을 사용하는 것이 좋습니다.
답변
Gson google 라이브러리를 사용하여 복잡한 개체 저장을위한 쉬운 모드 [1]
public static void setComplexObject(Context ctx, ComplexObject obj){
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(ctx);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("COMPLEX_OBJECT",new Gson().toJson(obj));
editor.commit();
}
public static ComplexObject getComplexObject (Context ctx){
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(ctx);
String sobj = preferences.getString("COMPLEX_OBJECT", "");
if(sobj.equals(""))return null;
else return new Gson().fromJson(sobj, ComplexObject.class);
}
답변
아래 코드를 사용하여 내 preferences.xml 파일에 허리 크기 배열 (이미 array.xml에서 생성됨)을로드했습니다. @ array / pant_inch_size는 전체 배열의 ID입니다.
<ListPreference
android:title="choosepantsize"
android:summary="Choose Pant Size"
android:key="pantSizePref"
android:defaultValue="34"
android:entries="@array/pant_inch_size"
android:entryValues="@array/pant_inch_size" />
이로 인해 메뉴가 어레이의 선택 항목으로 채워졌습니다. 기본 크기를 34로 설정 했으므로 메뉴가 표시되면 34가 미리 선택된 것으로 표시됩니다.
답변
간단한 방법은 아래 예제와 같이 JSON 문자열로 변환하는 것입니다.
Gson gson = new Gson();
String json = gson.toJson(myObj);
그런 다음 공유 기본 설정에 문자열을 저장합니다. 필요한 경우 공유 환경 설정에서 문자열을 가져 와서 JSONArray 또는 JSONObject로 다시 변환하십시오 (요구 사항에 따라).