안드로이드에서 가벼운 데이터를 저장하기 위해 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에 제대로 저장된 것을 확인할 수 있다.
'Android > SharedPreferences' 카테고리의 다른 글
[Android] EncryptedSharedPreferences로 암호화 하기 (0) | 2022.11.24 |
---|---|
[Android] SharedPreferences로 검색 리스트 만들기 (0) | 2022.11.21 |
댓글