사용자 정의 개체의 Android ArrayList-SharedPreferences에 저장-직렬화 가능?


78

개체의 ArrayList가 있습니다. 객체는 'Bitmap'과 'String'유형을 포함하고 두 가지 모두에 대한 getter 및 setter 만 포함합니다. 우선 비트 맵을 직렬화 할 수 있습니까?

SharedPreferences에 저장하기 위해 이것을 직렬화하는 방법은 무엇입니까? 나는 많은 사람들이 비슷한 질문을하는 것을 보았지만 좋은 대답을하는 사람은없는 것 같습니다. 가능한 경우 몇 가지 코드 예제를 선호합니다.

비트 맵을 직렬화 할 수없는 경우이 ArrayList를 저장하려면 어떻게해야합니까?

감사합니다.


된 SharedPreferences의 단점은 :( 저장소 개체에있는 개체를 그 수는 없습니다 있도록 저장할 수 없다는 것입니다
Abhinav 싱 마우리

직렬화하려면 이 답변을 사용할 수 있습니다 . SharedPreferences하지만 직렬화 된 객체를 거기에 저장할 수 없기 때문에 어떻게 도움이되는지 모르겠습니다 . 어쩌면 당신은 생각하고 Bundle있습니까?
Geobits 2013

1
네, 저장할 수 있습니다. 내 대답을 확인하십시오.
Mohammad Imran

답변:


148

예, 공유 환경 설정에서 복합 객체를 저장할 수 있습니다. 의 말을하자..

 Student mStudentObject = new Student();
 SharedPreferences appSharedPrefs = PreferenceManager
             .getDefaultSharedPreferences(this.getApplicationContext());
 Editor prefsEditor = appSharedPrefs.edit();
 Gson gson = new Gson();
 String json = gson.toJson(mStudentObject);
 prefsEditor.putString("MyObject", json);
 prefsEditor.commit(); 

.. 이제 객체를 다음과 같이 검색 할 수 있습니다.

 SharedPreferences appSharedPrefs = PreferenceManager
             .getDefaultSharedPreferences(this.getApplicationContext());
 Gson gson = new Gson();
 String json = appSharedPrefs.getString("MyObject", "");
 Student mStudentObject = gson.fromJson(json, Student.class);

자세한 내용은 여기를 클릭 하십시오.

ArrayList예를 들어 모든 유형의 객체를 다시 얻으려면 Student다음을 사용하십시오.

Type type = new TypeToken<List<Student>>(){}.getType();
List<Student> students = gson.fromJson(json, type);

JSON 배열 이름을 환경 설정에 저장하는 방법은 무엇입니까?
Noman

무슨 말이야? 질문을 자세히 설명해주세요.?
모하마드 이므 란

당신이 ArrayList에 저장하려면이 코드는 작동하지 않습니다
Bhavik 메타

12
@Bhavik Metha, 위의 코드는 Arraylists 용이 아니며 위의 코드는 예제 일뿐입니다. 학생에 대한 객체 유형의 배열 목록을 다시 가져 오려면 다음을 수행하십시오. Type type = new TypeToken <List <Student >> () {}. getType (); List <학생> students = gson.fromJson (json, type);
Mohammad Imran

1
좋은 생각입니다. 대박. 감사.
VipPunkJoshers Droopy

121

위의 답변은 작동하지만 목록에는 적용되지 않습니다.

객체 목록을 저장하려면 다음과 같이하십시오.

List<Cars> cars= new ArrayList<Cars>();
    cars.add(a);
    cars.add(b);
    cars.add(c);
    cars.add(d);

    gson = new Gson();
    String jsonCars = gson.toJson(cars);
    Log.d("TAG","jsonCars = " + jsonCars);

json 객체를 읽습니다.

Type type = new TypeToken<List<Cars>>(){}.getType();
List<Cars> carsList = gson.fromJson(jsonCars, type);

3
Type여기 의 패키지는 무엇입니까 ?
Shajeel Afzal 2014

9
import java.lang.reflect.Type;
SpyZip

다음과 같은 와일드 카드를 사용하면 어떻게됩니까? Type type = new TypeToken<List<?>>(){}.getType(); 결과적으로 LinkedTreeMap을 얻고 이것이 내 메서드의 정의입니다. public static List<?> getList(String json) {
f.trajkovski

23

나를 위해 다음과 같이 작동했습니다.

SharedPreferances에 값 입력 :

String key = "Key";
ArrayList<ModelClass> ModelArrayList=new ArrayList();

SharedPreferences shref;
SharedPreferences.Editor editor;
shref = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

Gson gson = new Gson();
String json = gson.toJson(ModelArrayList);

editor = shref.edit();
editor.remove(key).commit();
editor.putString(key, json);
editor.commit();

SharedPreferances에서 값을 가져 오려면 다음을 수행하십시오.

Gson gson = new Gson();
String response=shref.getString(key , "");
ArrayList<ModelClass> lstArrayList = gson.fromJson(response, 
    new TypeToken<List<ModelClass>>(){}.getType());

15

저장 :

public static void saveSharedPreferencesLogList(Context context, List<PhoneCallLog> callLog) {
    SharedPreferences mPrefs = context.getSharedPreferences(Constant.CALL_HISTORY_RC, context.MODE_PRIVATE);
    SharedPreferences.Editor prefsEditor = mPrefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(callLog);
    prefsEditor.putString("myJson", json);
    prefsEditor.commit();
}

부하 :

public static List<PhoneCallLog> loadSharedPreferencesLogList(Context context) {
    List<PhoneCallLog> callLog = new ArrayList<PhoneCallLog>();
    SharedPreferences mPrefs = context.getSharedPreferences(Constant.CALL_HISTORY_RC, context.MODE_PRIVATE);
    Gson gson = new Gson();
    String json = mPrefs.getString("myJson", "");
    if (json.isEmpty()) {
        callLog = new ArrayList<PhoneCallLog>();
    } else {
        Type type = new TypeToken<List<PhoneCallLog>>() {
        }.getType();
        callLog = gson.fromJson(json, type);
    }
    return callLog;
}

PhoneCallLog는 내 사용자 지정 개체의 이름입니다. (문자열, 긴 값 및 부울 값 포함)


1
apply대신 사용 하지 commit않습니까?
driftking9987

이러한 메서드 호출을 어디에해야합니까?
Lucas Sousa

2

위의 Mete의 예는 매력처럼 작동했습니다.
다음은 Kotlin 예입니다.

private var prefs: SharedPreferences = context?.getSharedPreferences("sharedPrefs", MODE_PRIVATE)
    ?: error("err")
private val gson = Gson()

저장

fun saveObjectToArrayList(yourObject: YourObject) {
    val bookmarks = fetchArrayList()
    bookmarks.add(0, yourObject)
    val prefsEditor = prefs.edit()

    val json = gson.toJson(bookmarks)
    prefsEditor.putString("your_key", json)
    prefsEditor.apply()
}

읽다

fun fetchArrayList(): ArrayList<YourObject> {
    val yourArrayList: ArrayList<YourObject>
    val json = prefs.getString("your_key", "")

    yourArrayList = when {
        json.isNullOrEmpty() -> ArrayList()
        else -> gson.fromJson(json, object : TypeToken<List<Feed>>() {}.type)
    }

    return yourArrayList
}

1

Gson@SpyZips의 답변을 확장 하는 kotlin 구현 ,

JSON으로 직렬화

val jsonCars: String = Gson().toJson(cars);

객체 목록으로 돌아 가기 역 직렬화

val type = object: TypeToken<List<Car>>(){}.type
val carsList: List<Car> = Gson().fromJson(jsonCars, type)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.