블로그 이사했습니다!
👇 블로그 이전 공지 👇
👇 새 블로그에서 글 보기 👇
[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' (자세한 설명보기)

리사이클러뷰에 아이템을 추가·수정·삭제를 하면 xml파일에 반영되는 것을 확인할 수 있다.
전체 코드
이전 글
SharedPreferences 사용해 데이터 저장하기
다음 글
SharedPreferences ArrayList 저장하기
참고자료
안드로이드 앱 개발 - 액티비티 전환 (기본 타입 이외에도 Parcelable, Json 사용하여 객체 전달하기) - YouTube
공부하며 정리한 글입니다. 내용에 대한 피드백은 언제나 환영입니다.
'android' 카테고리의 다른 글
| Thread - 화면 변경하기(초시계) (0) | 2021.01.22 | 
|---|---|
| SharedPreferences ArrayList 저장하기 (0) | 2021.01.21 | 
| SharedPreferences 사용해 데이터 저장하기 (0) | 2021.01.15 | 
| Firbase 사진 업로드하기 (0) | 2021.01.14 | 
| 이미지 받아 다른 액티비티에 전달하기 (0) | 2021.01.14 | 
 
										
									 
										
									 
										
									
댓글