[Android/Kotlin] SharedPreferences에 ArrayList<Object>를 저장하는 방법

hyomin·2022년 3월 3일
0

Android

목록 보기
6/9

SharedPreferences 에는 key와 value 를 각각 받도록 되어있다.

이번 포스팅에서는 value를 String으로 하여 Json 형식의 string을 저장하고 이를 다시 parsing해서 list로 만드는 작업을 해볼 것이다.

목표: sharedPreference에 ArrayList 를 저장하기

내가 저장하고자 하는 Object, MessageDTO 는 Json 형식은 이렇고

MessageDTO

{
  "title": "write anythig",
  "body": "test body",
  "timestamp":"2022-03-01 11:11:11.111"      
} 

이렇게 list가 되도록 하는 것이 목표이다.

ArrayList< MessageDTO >

[
    {
      "title": "write anythig1",
      "body": "test body",
      "timestamp":"2022-03-01 11:11:11.111"      
   } ,

     {
      "title": "write anythig2",
      "body": "test body",
      "timestamp":"2022-03-01 11:11:11.111"      
   } 
  ,
     {
      "title": "write anythig3",
      "body": "test body",
      "timestamp":"2022-03-01 11:11:11.111"      
   } 

]

첫번째로 build.gradle에서 dependencies에 Gson 라이브러리를 추가해주자.

implementation 'com.google.code.gson:gson:2.8.5'

Gson은 Json 형식을 객체로 만들어준다.

  1. sharedPreference에서 기존에 저장된 데이터를 꺼내서
  2. ArrayList로 만들고
  3. 새로운 데이터를 MessageDTO로 만든 후

    tempArray.addAll(gson.fromJson(prev,groupListType))

  4. list에 add 한다

    tempArray.add(data)

  5. 다시 ArrayList를 Json으로 바꾸어서 저장한다

    val groupListType: Type = object : TypeToken<ArrayList<MessageDTO?>?>() {}.type
    // 이 부분이 중요하다. Json을 객체로 만들 때 타입을 추론하는 역할을 한다.
    gson.toJson(tempArray,groupListType)

소스코드

     val title = Message["title"]
      val body = Message["body"]
      val timestamp= Message["timestamp"]
 
      val spf = getSharedPreferences("notification", MODE_PRIVATE) // 기존에 있던 데이터
      val editor =spf.edit()
      val gson = GsonBuilder().create()
      val data = MessageDTO(title, body,timestamp)
      val tempArray =ArrayList<MessageDTO>()
      val groupListType: Type = object : TypeToken<ArrayList<MessageDTO?>?>() {}.type // 이 부분이 중요하다. Json을 객체로 만들 때 타입을 추론하는 역할을 한다.

      val prev =spf.getString("messageList","none") // json list 가져오기
      val convertedData = gson.toJson(prev)

   
      if(prev!="none"){ //데이터가 비어있지 않다면? 
          if(prev!="[]" || prev!="")tempArray.addAll(gson.fromJson(prev,groupListType))
          tempArray.add(data)
          val strList = gson.toJson(tempArray,groupListType)
          editor.putString("messageList",strList)
      }else{
          tempArray.add(data)
          val strList = gson.toJson(tempArray,groupListType)
          editor.putString("messageList",strList)
      }

      editor.apply()
  } 

profile
🌱

0개의 댓글