source

Shared Preferences에 JSON 어레이를 저장해도 될까요?

ittop 2023. 3. 18. 09:22
반응형

Shared Preferences에 JSON 어레이를 저장해도 될까요?

저장해야 할 JSON 어레이가 있습니다.시리얼화를 생각하고 있었습니다만, Shared Preferences 에 문자열로 보존하고, 읽어야 할 때에 재구축 하는 것이 좋을까요?

Java의 JSON 개체는 개봉 즉시 직렬화할 수 있는 기능을 구현하지 않습니다.다른 사람들이 그것을 허용하기 위해 클래스를 확장하는 것을 본 적이 있지만, 당신의 상황이라면 JSON 오브젝트를 문자열로 저장하고 그 toString() 함수를 사용하는 것을 추천합니다.나는 이것으로 성공을 거두었다.

editor.putString("jsondata", jobj.toString());

그리고 그것을 되찾으려면:

String strJson = sharedPref.getString("jsondata","0");//second parameter is necessary ie.,Value to return if this preference does not exist. 

if (strJson != null) {
           try {
               JSONObject response = new JSONObject(strJson);

         } catch (JSONException e) {

         }
  }

http://developer.android.com/reference/org/json/JSONObject.html#JSONObject(java.lang.String)

어레이의 크기에 따라 다릅니다.크기가 터무니없이 크지 않다고 가정하면(수백 Kb 미만), 공유된 기본 설정에 저장하십시오.더 크면 파일에 저장할 수 있습니다.

공유 환경설정에 json 배열을 저장하려면 다음과 같이 클래스에서 메서드를 사용할 수 있습니다.

public class CompanyDetails {

@SerializedName("id")
private String companyId;

public String getCompanyId() {
    return companyId;
}
}

공유 기본 설정 클래스에서

public static final String SHARED_PREF_NAME = "DOC";
public static final String COMPANY_DETAILS_STRING = "COMPANY_DETAIL";
public static final String USER_DETAILS_STRING = "USER_DETAIL";

public static void saveCompanyDetailsSharedPref(Context mContext, CompanyDetails companyDetails){
    SharedPreferences mPrefs = mContext.getSharedPreferences(SHARED_PREF_NAME,Context.MODE_PRIVATE);
    SharedPreferences.Editor prefsEditor = mPrefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(companyDetails);
    prefsEditor.putString(COMPANY_DETAILS_STRING, json);
    prefsEditor.commit();
}

public static CompanyDetails getCompanyDetailsSharedPref(Context mContext){
    SharedPreferences mPrefs = mContext.getSharedPreferences(SHARED_PREF_NAME,Context.MODE_PRIVATE);
    SharedPreferences.Editor prefsEditor = mPrefs.edit();
    Gson gson = new Gson();
    String json = mPrefs.getString(COMPANY_DETAILS_STRING, "");
    if(json.equalsIgnoreCase("")){
        return null;
    }
    CompanyDetails obj = gson.fromJson(json, CompanyDetails.class);
    return obj;
}

값을 부르다

 private CompanyDetails companyDetails;
 companyDetails = shared_class.getCompanyDetailsSharedPref(mContext);
 companyDetails.getCompanyId()

저도 같은 작업을 했습니다. json 문자열에 Objet를 직렬화하여 공유 프리프로 저장합니다.문제 없습니다. 하지만 prefs는 궁극적으로 XML 파일이기 때문에 많이 읽고 쓰면 성능이 저하됩니다.

JSON을 직접 저장합니다.이렇게 생각해 봅시다.데이터 표현을 캡슐화하고 있습니다.특정 오브젝트 포맷을 시리얼 아웃 했을 경우, 그 오브젝트 포맷에 얽매이거나 오브젝트 변경에 대처해야 하며, 향후 오래된 시리얼라이제이션 포맷에서 새로운 포맷으로의 업그레이드가 걱정됩니다.JSON으로 저장하면 원하는 대로 부풀릴 수 있습니다.

네, 저장할 수 있습니다.

 public void saveData(View view) {
        User user = new User(1, "Rajneesh", "hi this is rajneesh  shukla");
        userList.add(user);

        SharedPreferences preferences = getSharedPreferences("DATA" , MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        Gson gson = new Gson();
        String s = gson.toJson(userList);
        editor.putString("USER_DATA", s);
        editor.apply();
    }

    public void logData(View view) {
        SharedPreferences preferences = getSharedPreferences("DATA", MODE_PRIVATE);
        String s = preferences.getString("USER_DATA", "Data is not saved" );

        Gson gson = new Gson();
        Type type = new TypeToken<ArrayList<User>>(){} .getType();
        ArrayList<User> mUser = gson.fromJson(s, type);

    }

다음은 Kotlin을 사용하여 사용자 클래스를 저장하는 간단한 버전입니다.

class PreferenceHelper(context: Context) {

    companion object {
        private const val prefsFileName = "com.example.prefs"
        private const val userConst = "user"
    }

    private val prefs: SharedPreferences = context.getSharedPreferences(prefsFileName, MODE_PRIVATE)

    var user: User?
        get() = GsonBuilder().create().fromJson(prefs.getString(userConst, null), User::class.java)
        set(value) = prefs.edit().putString(userConst, GsonBuilder().create().toJson(value)).apply()

}

예. SharedPreferences로 저장된 값은 원시 또는 문자열이어야 합니다.primitive 또는 String(또는 Set)이 아닌 경우 직렬화된 JSON 개체는 어떤 형식을 취합니까?JSON은 시리얼화된 데이터 형식입니다.이미 가지고 계신 거라면 쓰세요.

Json Array를 공유 설정에 저장하는 또 다른 쉬운 방법:

  public void SaveFriendList(String key, JSONArray value) {

    FriendLst = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    SharedPreferences.Editor editor = FriendLst.edit();
    editor.putString(key, value.toString());
    editor.commit();
}



public String LoadFriendList() {
    MyApplication.FriendLst = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    String FriendLsts = MyApplication.FriendLst.getString("Friends", "");
    return FriendLsts;
}

Json을 얻으려면 이 코드를 호출하세요:-)

 try {
           JSONArray jarry1 = new JSONArray(LoadFriendList());
           JSONObject jobject;
            datamodelfriends.clear();
             for (int i = 0; i < jarry1.length(); i++) {
                 jobject = jarry1.getJSONObject(i);
                 String FirstName = jobject.get("FirstName").toString();//You can get your own objects like this
                 datamodelfriends.add(new DataModelFriends(FirstName,...));

    }
    mAdapter = new CustomeAdapterFriendList(datamodelfriends, MainActivity.this);

                                RecyclerView_Friends.setAdapter(mAdapter);

                            } catch (Exception e) {
                            }

언급URL : https://stackoverflow.com/questions/5918328/is-it-ok-to-save-a-json-array-in-sharedpreferences

반응형