📱 Android

[Android] SharedPreference에 ArrayList, HashMap 저장하기

콩드로이드 2021. 3. 24. 22:25

안녕하세요 

오늘은 SharedPreference에 ArrayList, HashMap을 저장하는 방법에 대해 알아보고자 합니다

 

우선, SharedPreference에 대해 잘 모르시는 분이라면

2021.01.19 - [Android] - [Android] SharedPreferences 사용하기 를 보고 오시는 것을 추천드립니다 :) 

 

[Android] SharedPreferences 사용하기

SharedPreferences란? ✔ 데이터가 파일로 저장되고, 저장하려는 키-값 컬렉션이 비교적 작은 경우에 주로 사용됩니다. ✔ DB를 사용하지 않고, 간단한 데이터들을 저장할 때 주로 쓰이며, 앱을 껐다

ddusi-dod.tistory.com

 

소스는 Kotlin으로 작성했습니다 


1. ArrayList 저장하기

 

SharedPreference에는 ArrayList를 저장을 하기 위해선, 아래의 과정을 거쳐야합니다

 

ArrayList ➡️ JSONArray ➡️ toString()

 

JSONArray로 변경한 뒤 String으로 변경해서 저장하는 방식입니다 

 

// 1) ArrayList
var arr : ArrayList<String> = ArrayList()
arr.add(0, "킬빌")
arr.add(1, "저수지의 개들")
arr.add(2, "바스터즈")

// 2) JsonArray
var jsonArr = JSONArray()
for(i in arr){
	jsonArr.put(i)
}


// 3) toString()
var result = jsonArr.toString()

val sharedPref = getPreferences(Context.MODE_PRIVATE) ?: return
    with (sharedPref.edit()) {
        putString("지정한 KEY값", result)
        commit()
    }

 

string으로 변경하는 방법은 JSONArray를 toString()하면 끝이기에 소스가 그리 복잡하진 않습니다

 

2. ArrayList 불러오기

 

불러올 땐, 저장할 때와 반대의 과정을 거칩니다

getString()   ➡️  JSONArray   ➡️ ArrayList에 Add

 

// 1)
val getShared = shared.getString("KEY", "")

// 2)
var resultArr : ArrayList<String> = ArrayList()
var arrJson = JSONArray(getShared)

// 3)
for(i in 0 until arrJson.length()){
	resultArr.add(arrJson.optString(i))
}

// 출력
for(i in resultArr.indices){
	Timber.i(resultArr[i])
}

출력 시엔 resultArr을 가져와서 찍어주면 됩니다

킬빌
저수지의 개들
바스터즈

📌 optString() : getString()은 존재하지 않는 값이면 Exception이 발생하지만, optString()을 사용하면 empty String을 반환해줍니다. 

 


3. HashMap 저장하기

 

HashMap은 광범위하게 많이 사용되는 클래스이기 때문에 중요합니다

마찬가지로, HashMap에 대해 모르시는 분이라면 아래의 포스팅을 참조해주세요 🙂

 

2020.10.18 - [Java] - [Java/Kotlin] HashMap을 사용해보자

 

[Java/Kotlin] HashMap을 사용해보자

HashMap - Map 인터페이스로, Key와 Value값으로 데이터를 저장 HashMap을 사용할 일이 많은데, 제대로 정리를 해두면 좀 더 편하게 쓸 수 있을 것 같아 간략하게 정리해보았습니다. 기본 사용법 🔹 HashMa

ddusi-dod.tistory.com

 

HashMap 저장도 데이터를 스트링으로 JSON형태의 String으로 변경한 후 저장하는 작업을 거칩니다

다만, ArrayList 저장과 차이가 있다면 HashMap에서는 JSONObject를 사용합니다 

 HashMap 생성  ➡️ JSONObject   ➡️ toString()

// 1)
var hash = HashMap<String, String>()
hash["movie"] = "lala land"
hash["music"] = "city of star"

// 2)
val json = JSONObject(hash as Map<*, *>)

// 3)
val shared = getPreferences(Context.MODE_PRIVATE) ?: return
with(shared.edit()){
	putString("KEY", json.toString())
    	commit()
}

 

⚠ 여기서 주의할 점은 JSONObject로 변경 시, (Mutable)Map<*,*>의 형태를 사용해야 하기 때문에

hash를 Map<*, *> (as Map<*, *>)으로 변경해줍니다 

 

4. HashMap 가져오기

 

가져오는 경우는 2번과 비슷합니다

JSONObject로 변환한 후, String의 형태로 가져오면 됩니다

 getString() ➡️  JSONObject  ➡️  toString()

// 1)
var sharedStr = shared.getString("KEY", "")

var result = ""
if(sharedStr != ""){
	// 2)
	var obj = JSONObject(sharedStr)
    
    // 3)
    result = obj.optString("movie","")
}

 

HashMap은 KEY-VALUE의 형태로 저장되기 때문에 "movie" 자리에 원하는 KEY값을 입력하면 Value를 가져옵니다.

편하게 쓰시려면 key값을 매개변수로 받는 함수로 만드는 것도 하나의 방법입니다 


오늘 포스팅은 조금 길어졌네요 

혹시 잘못된 내용이나 궁금한 점이 있으면 댓글 부탁드립니다 

 

감사합니다 🥰