마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Gson shared preference data 불러오기 오류 문제가 있습니다.. ㅜㅜㅜ

0 추천

Gson 을 이용하여 Shared preference 사용하고 있습니다.  

글이 보여지는 Activity A (리사이클러뷰 Adapter와 연결되어있습니다.)

버튼을 눌러서 글을 작성하는 Activity B 

1. 첫번째 상황 : 처음으로 앱을 실행하고 글을 추가하면 리사이클러뷰에 제가 추가한 글이 보이고 그 상태에서 앱을 껏다가 켜도 

추가된 글들이 남아있습니다.  

2. 두번째 상황 : 아까 첫번째 상황에서 추가 한 글들은 남아있지만 , 여기서 문제점이 발생합니다. 

문제점은 Activity B로 간뒤 글을 다시 추가를 하면 기존에 첫번째 상황에서 추가된 글의 목록은 Activity A 부분에  보이지않고, 

새롭게 스택이 쌓입니다.. 

 

 기존에 있던 정보에 새로운글이 쌓이게 하는 방법을 찾고 싶어서 글을 올리게되었습니다.

이 문제에서 3일동안 고민을 해봤는데 .. 답이 나오지않아서 요청드립니다. 

글이 보여지는 Activity A 에서 Data를 불러오는 코드입니다.

public  void loadData() {
    Gson gson = new Gson();  // Gson 사용을 위한 객체선언
    String json = sharedPreferences.getString("List", null); // xml 파일안에 내가 정의한 Key 값으로 저장된 String 내용을 불러옴.
    Type type = new TypeToken<ArrayList<PostList>>() {}.getType(); // Key 값이 저장된 PostList 형식에 맞추어서 객체로 만듬.
    postlistaftersave  = gson.fromJson(json, type); // 데이터를 받을 객체
    if (postlistaftersave == null) { //  postlistaftersave 공간에 아무것도 없으면, postlistaftersave은 기존의 있는 데이터를 업데이트 시켜 사용자에게 보여주게되고.
        postlistaftersave = postlist1; // 이전에 하드코딩한 애들을 불러온다.
    } else {// 저장된 값이 있다면 postlistaftersave 기존의 있는 데이터를 업데이트 시켜 사용자에게 보여주게되고.
        postlist1 = postlistaftersave;
    }
}

b activity 에서 데이터를 저장하는 코드입니다.

   public void SaveData() {
        SharedPreferences.Editor editor = sharedPreferences.edit(); // 2. 에디터 객체를 만든후에, 그 에디터 객체에
        Gson gson = new Gson(); // 5. Json 배열을 쉐어드에 저장시켜주는 Gson 생성
        String json = gson.toJson(postlist1); // 6. 어레이리스트를 Json 형식으로 바꿔준다음 Put String으로 쉐어드안에 기록.
        editor.putString("List", json); // 3. 키를 넣고, 데이터를 넣어서
        editor.commit(); // 4. shared에 업데이트 시키는법
        Log.e(TAG, "AddEditOne Activity 에서 성공적으로 글 저장함." + json);
    }
} 
postlist1 = myApplication.getPostlist1();입니다 
postlist1은 My Application 이라는 클래스에서 데이터를 불러오고 저장을 합니다. My application 클래스 안에 코드들입니다. 
public class MyApplication extends Application {

   ArrayList<PostList> postlist1 = new ArrayList<PostList>();
    private static int nextId = 5;

    public MyApplication() {
        fillPictureList();
    }
    private void fillPictureList() {

        PostList p0 = new PostList(0,"1","","ㅋㅋㅋㅋ");
        PostList p1 = new PostList(1,"2", "ㅋㅋㅋㅋ");
suz123 (130 포인트) 님이 2021년 11월 11일 질문

1개의 답변

+1 추천

SharedPreference는 간단한 설정 등을 저장하는 용도로만 사용하시는게 좋아요. 작성하는 글과 같은 걸 저장하는 용도로는 파일이나 DB가 더 적합할 듯 싶습니다. 더 빠르기도 하구요.  DB는 Room같은 걸 사용하시면 되고 읽고 쓰고 하는 기본적이 기능들이 제공됩니다. 물론 그보다 훨씬 많지만...

SharedPreference는  XML로 되어 있어서 타입이 보장되지는 않습니다. 모든게 사실 String입니다. 그리고 현재 발생하는 문제는 리스트를 JSON으로 저장할 때 기존의 리스트를 처리하지 않기 때문에 생기는 문제로 보입니다.

즉,  리스트로 데이터를 저장하시기 때문에 리스트를 계속 가지고 다니면서 리스트를 업데이트 해주셔 해요.

List<PostList> postLists = getPostListsFromSharedPreferences();

이렇게 최초로 데이터를 가져오신 상태에서 새로운 Post가 추가되면 postLists를 업데이트하신 후 SharedPreference 다시 저장을 하셔야겠죠? 추가/삭제 동작을 보면 아래처럼 될 겁니다.

List<PostList> postLists = getPostList();

public List<PostList> getPostList() {
   // Sharepreferences에서 리스트를 가져옴
}

public void savePostLists() {
   // Sharepreferences postList를 저장.
}

public void addPost(PostList postList) {
    postLists.add(postList);
    savePostLists();
} 

public void deletePostList(PostList postList) {
    postLists.remove(postList);
    savePostLists();
} 

 

그런데 위의 메소드를 액티비마다 만들어서 사용하시면 같은 코드가 반복되므로 좋지않은 코드가 됩니다. 클래스를 별도로 하나 만드셔서 Singleton을 만드세요.

// PostList클래스는 Post가 더 적합한 이름 같아요.

public class PostStore {
    private static final String POSTS_KEY = "List";

    private final Gson gson = new Gson(); 
    private final List<Post> postList = new ArrayList<>();
   
    private final SharePreferences prefs;
    public PostStore(SharePreferences prefs) {
           this.prefs = prefs;
    }

    private void loadPostList() {
          String json = prefs.getString(POSTS_KEY, null);

        Type type = new TypeToken<List<Post>>() {}.getType();
        postList = gson.fromJson(json, type); 
    }
    
    public List<Post> getPostList() {
        loadPostList();
        return postList;
    }

    public void addPost(Post post) {
        postList.add(post);
        saveData();
    }

    public void deletePost(Post post) [
         postList.remove(post);
         saveData();
    }

    private void saveData() {
        prefs.edit(); 
        String json = gson.toJson(postList);
        editor.putString(POSTS_KEY, json);
        editor.commit();
    }
}

 

spark (227,530 포인트) 님이 2021년 11월 11일 답변
spark님이 2021년 11월 11일 수정
답변 감사드립니다 !! 혼자 독학으로 하는지라 아직 많이 부족한 부분이 있는데
Spark 님의 조언을 듣고 다시 한번 해보겠습니다 !! 감사합니다 !!
...