Android/SharedPreferences

[Android] SharedPreferences에 ArrayList로 저장하기

O_Gyong 2022. 11. 16.

안드로이드에서 가벼운 데이터를 저장하기 위해 SharedPreferences를 사용하곤 한다.

ShardPreferences는 key-value 형태로 기기에 데이터를 저장된다. value에는 String, Int, Boolean과 같은 자료형들을 담을 수 있다.

그러면 list(array)의 경우 어떻게 해야 할까?

 

list를 json 형식의 string으로 변환하여 저장하고, 사용할 때는 json 형식의 string을 list로 변환하여 사용해야 한다.

이 동작을 Gson 라이브러리를 통해 쉽게 할 수 있다.


SharedPreferences에 ArrayList로 데이터 저장하기

EditText에 텍스트를 입력을 완료하면 현재 날짜와 입력한 텍스트를 ArrayList로 변환하여 기기에 저장하려 한다.

그리고 검색 기록처럼 텍스트를 입력할 때마다 기기에 데이터가 쌓이게 할 것이다.


 Gson 의존성 추가

// gson
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

PrefData(data class)

data class PrefData (
    val text : String,
    val date :String
)

EditText에서 입력한 내용인 text, 입력 시간인 date를 담을 data class를 만들었다.


SharedPreferences 설정

/**
 * SharedPreference 설정
 */
private fun settingPrefs() {
    mPrefs = getSharedPreferences("pref_file", MODE_PRIVATE) // SharedPreferences 불러오기
    mEditPrefs = mPrefs.edit() // SharedPreferences Edit 선언
    stringPrefs = mPrefs.getString("pref_data", null)

    // SharedPreferences 데이터가 있으면 String을 ArrayList로 변환
    // fromJson → json 형태의 문자열을 명시한 객체로 변환(두번째 인자)
    if(stringPrefs != null && stringPrefs != "[]"){
        arrayListPrefs = GsonBuilder().create().fromJson(
            stringPrefs, object: TypeToken<ArrayList<PrefData>>(){}.type
        )
    }
}

 

onCreate에서 호출한 메서드이다.

SharedPreferences와 Editor를 초기화하고 SharedPreferences에 있던 문자열의 json을 stringPrefs에 할당한다.

 

만약 기기에 저장된 값이 있다면 Gson의 fromJson을 이용해서 json 형태의 문자열을 ArrayList로 변환하여 arrayListPrefs에 할당한다.


SharedPreferences 저장

/**
 * SharedPreferences 저장
 */
private fun savePrefs(inputText: String) {
    // ArrayList에 추가
    arrayListPrefs.add(
        0,
        PrefData(
            inputText,
            SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(System.currentTimeMillis()) // 현재 날짜
        )
    )

    // ArrayList를 json 형태의 String으로 변환
    // toJson → json으로 변환된 문자열 리턴
    stringPrefs = GsonBuilder().create().toJson(
        arrayListPrefs,
        object : TypeToken<ArrayList<PrefData>>() {}.type
    )
    mEditPrefs.putString("pref_data", stringPrefs) // SharedPreferences에 push
    mEditPrefs.apply() // SharedPreferences 적용
}

EditText에 텍스트 입력이 완료됐을 때 호출하는 메서드이다.

 

ArrayList에 데이터를 삽입하고, Gson의 toJson을 사용하여 ArrayList를 json 형태의 문자열로 변환하여 stringPrefs에 할당한다.

그리고 stringPrefs를 SharedPreferences에 저장하면 된다.


EditText 입력 처리

// EditText 키보드 이벤트
mBinding.etTextField.setOnEditorActionListener { textView, actionId, _ ->
    // 키보드에서 완료 버튼이 눌렸을 때 처리
    if(actionId == EditorInfo.IME_ACTION_DONE){
        savePrefs(textView.text.toString()) // SharedPreferences에 저장
    }
    false // false로 해야 키패드가 닫힘
}

EditText의 setOnEditorActionListener를 사용하면 키보드 이벤트를 처리할 수 있다.

키보드에서 완료 버튼을 클릭했을 때 savePrefs 메서드를 호출하도록 했다.


MainActivity 전체 코드

class MainActivity : AppCompatActivity() {
    private lateinit var mBinding: ActivityMainBinding
    private lateinit var mPrefs : SharedPreferences
    private lateinit var mEditPrefs: SharedPreferences.Editor

    private var arrayListPrefs = ArrayList<PrefData>() // 저장할 ArrayList
    private var stringPrefs : String? = null // 저장할 때 사용할 문자열 변수

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        mBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(mBinding.root)

        settingPrefs()

        // EditText 키보드 이벤트
        mBinding.etTextField.setOnEditorActionListener { textView, actionId, _ ->
            // 키보드에서 완료 버튼이 눌렸을 때 처리
            if(actionId == EditorInfo.IME_ACTION_DONE){
                savePrefs(textView.text.toString()) // SharedPreferences에 저장
            }
            false // false로 해야 키패드가 닫힘
        }
    }

    /**
     * SharedPreferences 설정
     */
    private fun settingPrefs() {
        mPrefs = getSharedPreferences("pref_file", MODE_PRIVATE) // SharedPreferences 불러오기
        mEditPrefs = mPrefs.edit() // SharedPreferences Edit 선언
        stringPrefs = mPrefs.getString("pref_data", null)

        // SharedPreferences 데이터가 있으면 String을 ArrayList로 변환
        // fromJson → json 형태의 문자열을 명시한 객체로 변환(두번째 인자)
        if(stringPrefs != null && stringPrefs != "[]"){
            arrayListPrefs = GsonBuilder().create().fromJson(
                stringPrefs, object: TypeToken<ArrayList<PrefData>>(){}.type
            )
        }
    }

    /**
     * SharedPreferences 저장
     */
    private fun savePrefs(inputText: String) {
        // ArrayList에 추가
        arrayListPrefs.add(
            0,
            PrefData(
                inputText,
                SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(System.currentTimeMillis()) // 현재 날짜
            )
        )

        // ArrayList를 json 형태의 String으로 변환
        // toJson → json으로 변환된 문자열 리턴
        stringPrefs = GsonBuilder().create().toJson(
            arrayListPrefs,
            object : TypeToken<ArrayList<PrefData>>() {}.type
        )
        mEditPrefs.putString("pref_data", stringPrefs) // SharedPreferences에 push
        mEditPrefs.apply() // SharedPreferences 적용
    }
}

SharedPreferences의 파일을 확인하고 싶다면 안드로이드 스튜디오의 Device File Explorer에서 data> data>'패키지 명'> shared_prefs에 있다.

EditText에 차례대로 '가', '나', '다' 라고 입력하였고 pref_file에 제대로 저장된 것을 확인할 수 있다. 

 

전체 코드

댓글