본문 바로가기
android

SharedPreferences 객체 저장하기

by 윈 Win 2021. 1. 16.
728x90

블로그 이사했습니다!

 

👇 블로그 이전 공지 👇

블로그 이전 안내 (tistory.com)

 

 

👇 새 블로그에서 글 보기 👇

[Android] SharedPreferences 객체 저장하기 — Win Record (tistory.com)

 

[Android] SharedPreferences 객체 저장하기

⚠️ 2021.01.16에 작성된 글입니다 ⚠️ 코드는 [Android] SharedPreferences 데이터 저장하기에서 이어집니다. 로컬에 객체 저장하기 이전 글에서 살펴봤듯, SharedPreferences를 이용해 저장할 수 있는 데이

win-record.tistory.com

 

 


 

코드는 SharedPreferences관련 첫 글에서 이어집니다.

 

 

 

 

로컬에 객체 저장하기

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

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

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

 

 

작업 흐름:

객체, GSON을 사용하여

JSON으로 변환

SharedPreferences에 저장

저장된 JSON 꺼내와

GSON 사용하여 객체로 변환

 

 

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

 

 


GSON 추가하기

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

 

 


이전 글

SharedPreferences 사용해 데이터 저장하기

다음 글

SharedPreferences ArrayList 저장하기

 


참고자료

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

 

 

 

 

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

댓글