[Android] SharedPreferences 객체 저장하기

2022. 10. 22. 02:15·Android
⚠️ 2021.01.16에 작성된 글입니다 ⚠️

 

 

코드는 [Android] SharedPreferences 데이터 저장하기에서 이어집니다.

 

로컬에 객체 저장하기

이전 글에서 살펴봤듯, SharedPreferences를 이용해 저장할 수 있는 데이터의 타입은 한정적이다.

따라서 split()을 이용해 리사이클러뷰의 아이템 객체를 String 타입으로 변환해 저장했는데,

이 방법에서 더 나아가 객체 자체를 SharedPreferences에 저장해본다.

 

 

작업 흐름:

객체, GSON을 사용하여

JSON으로 변환

↓

SharedPreferences에 저장

↓

저장된 JSON 꺼내와

GSON 사용하여 객체로 변환

 

 

JSON은 객체의 정보를 String 형태로 구조화하여 저장하는 형식이기 때문에 자바 객체의 정보를 JSON 형태로 변환하면 SharedPreferences에 구조화된 정보를 저장할 수 있다. 저장하기 위해서 객체와 JSON간 변환해주는 라이브러리인 GSON를 사용한다. JSON 형태의 정보(String)을 원하는 객체로 만드는 과정을 'JSON을 파싱한다'고 말한다.

 

 


GSON 추가하기

Glide를 추가할 때([Android] Glide 사용하기)처럼 GSON라이브러리 추가한다.

Ctrl+Shift+Alt+S>Dependencies>1 Library Dependency>gson 검색>com.google.code.gson>최신버전>Apply

 

 

 

 

 


GSON 메소드

toJson() : 객체 → JSON

fromJson : JSON → 객체

 

// gson 객체 생성
Gson gson = new GsonBuilder().create();

// 객체 → json
Member member = new Member(); // 객체 생성
String json = gson.toJson(member); // 객체 memeber JSON으로 변환

// json → 객체
String value = "json string"; // 객체로 만들 데이터
Member member = gson.fromJson(value, Member.class); // 데이터를 Member.class 형태로 변환

 

 

 


JSON으로 SharedPreferences에 객체 저장하기

 

- BaseActivity.java

리사이클러뷰 아이템인 멤버 객체를 조회·추가·수정·삭제하는 등의 메소드가 있는, 모든 액티비티의 부모 액티비티

 

public class BaseActivity extends AppCompatActivity {
    Gson gson = new GsonBuilder().create();

    void addMember(String name, int age, String job) {
        int newIndex = getMemberSize() + 1;
        if (newIndex > 0) {
            String key = String.format(Locale.KOREA, "%s%03d", MEMBER, newIndex); // key = MEMBER001;
            Member member = new Member(key, name, age, job);
            String value = gson.toJson(member);
            editor.putString(key, value); // 새로운 멤버 정보
            editor.apply();
        }
    }

    void editMember(Member member) {
        String value = gson.toJson(member);
        editor.putString(member.getKey(), value).apply();
    }

    void deleteMember(String memberKey) {
//        선택한 member 객체의 키부터 마지막 키까지 하나씩 데이터를 당기는 작업. 마지막 키는 삭제.
        int index = Integer.parseInt(memberKey.replace(MEMBER, "")); // if member.key == MEMBER001 -> index == 1
        while (true) {
            String key = String.format(Locale.KOREA, "%s%03d", MEMBER, index); // 현재 키
            String nextKey = String.format(Locale.KOREA, "%s%03d", MEMBER, index + 1); // 다음 키
            String value = sharedPreferences.getString(nextKey, null); // 다음 키의 데이터

            if (value == null) { // 마지막 키인 경우 삭제하기
                editor.remove(key);
                break;
            } else {// 다음 키가 있을 경우 현재 키에 다음 키의 값을 넣어주기
                Member member = gson.fromJson(value, Member.class);
                member.setKey(key);
                value = gson.toJson(member);
                editor.putString(key, value);
            }
            index++;
        }
        editor.apply();
    }

    Member getMember(int index) {
        String key = String.format(Locale.KOREA, "%s%03d", MEMBER, index + 1); // arraylist나 for문을 돌려 가지고 올 때의 index는 0부터 n-1까지이므로 key를 설정할 때에는 index+1해줌
        String value = sharedPreferences.getString(key, null); // 해당 키의 데이터 가져오기
        if (value == null) return null; // 키에 대한 데이터가 null 이면 null 리턴

        return gson.fromJson(value, Member.class);
    }

    void getMemberList(ArrayList<Member> members) {
        int i = 0;
        while (true) {
            if (getMember(i) == null) break;
            members.add(getMember(i));
            i++;
        }
    }

    int getMemberSize() {
        int i = 0;
        while (true) {
            if (getMember(i) == null) return i;
            i++;
        }
    }
}

 

 


결과 화면

 

Shift키 두 번 눌러 Device File Explorer 검색, Device File Explorer탭에서 'data>data>패키지명>shared_prefs>파일명.xml' (자세한 설명보기)

 

Member.xml에 저장된 JSON형태의 정보

 

리사이클러뷰에 아이템을 추가·수정·삭제를 하면 xml파일에 반영되는 것을 확인할 수 있다.

 

 


전체 코드

StoreObjectUsingJson

 

 


참고자료

안드로이드 앱 개발 - 액티비티 전환 (기본 타입 이외에도 Parcelable, Json 사용하여 객체 전달하기) - YouTube

 

 

 

 

공부하며 정리한 글입니다. 내용에 대한 피드백은 언제나 환영입니다.

728x90
저작자표시 비영리 변경금지 (새창열림)

'Android' 카테고리의 다른 글

[Android] WebView 웹뷰  (0) 2022.10.22
[Android] SharedPreferences ArrayList 저장하기  (0) 2022.10.22
[Android] SharedPreferences 데이터 저장하기  (0) 2022.10.22
[Android] RecyclerView CRUD  (0) 2022.10.22
[Android] RecyclerView 사용법  (0) 2022.10.22
'Android' 카테고리의 다른 글
  • [Android] WebView 웹뷰
  • [Android] SharedPreferences ArrayList 저장하기
  • [Android] SharedPreferences 데이터 저장하기
  • [Android] RecyclerView CRUD
Wintinue
Wintinue
201 Created!
  • Wintinue
    Win Record
    Wintinue
    • 📘 Post (68)
      • Android (32)
      • Nest.js (1)
      • NGINX (1)
      • Error (10)
      • AWS (1)
      • Git (3)
      • IT용어 (4)
      • CMD (2)
      • Language (5)
        • PHP (3)
        • Java (2)
      • Project (5)
        • 개인 프로젝트 (3)
        • 팀 프로젝트 (2)
  • 링크

    • Github
  • 전체
    오늘
    어제
  • hELLO· Designed By정상우.v4.10.3
Wintinue
[Android] SharedPreferences 객체 저장하기
상단으로

티스토리툴바