⚠️ 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' (자세한 설명보기)
리사이클러뷰에 아이템을 추가·수정·삭제를 하면 xml파일에 반영되는 것을 확인할 수 있다.
전체 코드
참고자료
안드로이드 앱 개발 - 액티비티 전환 (기본 타입 이외에도 Parcelable, Json 사용하여 객체 전달하기) - YouTube
공부하며 정리한 글입니다. 내용에 대한 피드백은 언제나 환영입니다.
'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 |