문제

내 앱의 경우 간단한 SparseBooleanArray를 메모리에 저장하고 나중에 읽어야 합니다.SharedPreferences를 사용하여 저장하는 방법이 있나요?

나는 SQLite 데이터베이스를 사용하는 것을 고려했지만 이렇게 간단한 것을 사용하기에는 너무 과도한 것 같았습니다.StackOverflow에서 찾은 다른 답변 중 일부는 GSON을 사용하여 문자열로 저장하는 것을 제안했지만 이 앱을 파일 크기에서 매우 가볍고 빠르게 유지해야 합니다.타사 라이브러리에 의존하지 않고 좋은 성능을 유지하면서 이를 달성할 수 있는 방법이 있습니까?

도움이 되었습니까?

해결책

JSON의 전원을 사용하여 모든 유형의 객체에 대한 공유 환경 설정을 저장할 수 있습니다.

sparseintarray. JSON 문자열과 같은 항목을 저장하십시오

public static void saveArrayPref(Context context, String prefKey, SparseIntArray intDict) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    JSONArray json = new JSONArray();
    StringBuffer data = new StringBuffer().append("[");
    for(int i = 0; i < intDict.size(); i++) {
        data.append("{")
                .append("\"key\": ")
                .append(intDict.keyAt(i)).append(",")
                .append("\"order\": ")
                .append(intDict.valueAt(i))
                .append("},");
        json.put(data);
    }
    data.append("]");
    editor.putString(prefKey, intDict.size() == 0 ? null : data.toString());
    editor.commit();
}
.

및 JSON 문자열 읽기

public static SparseIntArray getArrayPref(Context context, String prefKey) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    String json = prefs.getString(prefKey, null);
    SparseIntArray intDict = new SparseIntArray();
    if (json != null) {
        try {
            JSONArray jsonArray = new JSONArray(json);
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject item = jsonArray.getJSONObject(i);
                intDict.put(item.getInt("key"), item.getInt("order"));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    return intDict;
}
.

다음과 같이 사용하십시오 :

    SparseIntArray myKeyList = new SparseIntArray(); 
    ...
    //write list
    saveArrayPref(getApplicationContext(),"MyList", myKeyList);
    ...
    //read list
    myKeyList = getArrayPref(getApplicationContext(), "MyList");
.

다른 팁

값을 별도로 쓰고 쓰는 값의 이름 목록을 보관하십시오.

    SparseBooleanArray array = //your array;
    SharedPreferences prefs = //your preferences

    //write
    SharedPreferences.Editor edit = prefs.edit();
    Set<String> keys = new HashSet<String>(array.size());
    for(int i = 0, z = array.size(); i < z; ++i) {
        int key = array.keyAt(i);
        keys.add(String.valueOf(key));
        edit.putBoolean("key_" + key, array.valueAt(i));
    }
    edit.putStringSet("keys", keys);
    edit.commit();

    //read
    Set<String> set = prefs.getStringSet("keys", null);
    if(set != null && !set.isEmpty()) {
        for (String key : set) {
            int k = Integer.parseInt(key);
            array.put(k, prefs.getBoolean("key_"+key, false));
        }
    }
.

문자열 세트는 API 11부터 지원됩니다. 대신 단일 CSV 문자열을 만들고 세트를 저장하는 대신 분할 할 수 있습니다.

당신은 할 수 있습니다 serialize 객체를 바이트 배열로 변환한 다음 SharedPreferences에 저장하기 전에 바이트 배열을 base64로 변환할 수 있습니다.객체 직렬화는 정말 쉽습니다. 이를 위해 타사 라이브러리가 필요하지 않습니다.

public static byte[] serialize(Object obj) {
    ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream();
    ObjectOutputStream objectOS = new ObjectOutputStream(byteArrayOS);
    objectOS.writeObject(obj);
    objectOS.flush();
    return byteArrayOS.toByteArray();
}

public static Object deserialize(byte[] data) {
    ByteArrayInputStream byteArrayIS = new ByteArrayInputStream(data);
    ObjectInputStream objectIS = new ObjectInputStream(byteArrayIS);
    return objectIS.readObject();
}

위의 코드에는 단순화를 위해 try catch 블록이 없습니다.직접 추가할 수 있습니다.

나는 GSON

를 사용하여 다음과 같이 해왔습니다.

sharedpreference에서 sparseboolean 배열을 저장하려면 다음을 수행하십시오.

public void SaveSparseBoolean() {
    SparseBooleanArray booleanArray = new SparseBooleanArray();
    SharedPreferences sP;
    sP=context.getSharedPreferences("MY_APPS_PREF",Context.MODE_PRIVATE)
    SharedPreferences.Editor editor=sP.edit();
    Gson gson=new Gson();
    editor.putString("Sparse_Array",gson.toJson(booleanArray));
    editor.commit();
}
.

sharedpreferences에서 sparsebooleanArray를 얻으려면

public SparseBooleanArray getSparseArray() {
    SparseBooleanArray booleanArray;
    SharedPreferences sP;
    sP = context.getSharedPreferences("MY_APPS_PREF", Context.MODE_PRIVATE);
    Gson gson=new Gson();
    booleanArray=gson.fromJson(sP.getString("Sparse_Array",""),SparseBooleanArray.class);
    return booleanArray;

}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top