티스토리 뷰

반응형

Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.

Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.

 

아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.

Save ArrayList to SharedPreferences

ArrayList를 SharedPreferences에 저장하기

 문제 내용 

I have an ArrayList with custom objects. Each custom object contains a variety of strings and numbers. I need the array to stick around even if the user leaves the activity and then wants to come back at a later time, however I don't need the array available after the application has been closed completely. I save a lot of other objects this way by using the SharedPreferences but I can't figure out how to save my entire array this way. Is this possible? Maybe SharedPreferences isn't the way to go about this? Is there a simpler method?

저는 커스텀 객체를 포함한 ArrayList가 있습니다. 각각의 커스텀 객체는 다양한 문자열과 숫자를 포함합니다. 사용자가 활동을 떠나고 나중에 다시 돌아와야 하는 경우에도 배열이 계속 유지되어야하지만, 애플리케이션이 완전히 종료된 후에는 배열을 사용할 필요가 없습니다. 저는 SharedPreferences를 사용하여 많은 다른 객체를 저장하지만, 전체 배열을 이 방법으로 저장하는 방법을 찾을 수 없습니다. 이게 가능할까요? SharedPreferences가 이 문제를 해결하는 가장 간단한 방법이 아닌가요?

 

 

 

 높은 점수를 받은 Solution 

After API 11 the SharedPreferences Editor accepts Sets. You could convert your List into a HashSet or something similar and store it like that. When you read it back, convert it into an ArrayList, sort it if needed and you're good to go.

API 11 이후로 SharedPreferences Editor는 Set을 허용합니다. 따라서 List를 HashSet 또는 유사한 형태로 변환하고 그렇게 저장할 수 있습니다. 읽을 때는 ArrayList로 변환하고 필요하다면 정렬하면 됩니다.

 

//Retrieve the values
Set<String> set = myScores.getStringSet("key", null);

//Set the values
Set<String> set = new HashSet<String>();
set.addAll(listOfExistingScores);
scoreEditor.putStringSet("key", set);
scoreEditor.commit();

You can also serialize your ArrayList and then save/read it to/from SharedPreferences. Below is the solution:

ArrayList를 직렬화하고 그것을 SharedPreferences에 저장/읽기도 할 수 있습니다. 아래는 그 해결책입니다.

 

EDIT:
Ok, below is the solution to save ArrayList as a serialized object to SharedPreferences and then read it from SharedPreferences.

수정: 아래는 ArrayList를 직렬화된 객체로 SharedPreferences에 저장하고, 그것을 SharedPreferences에서 읽는 방법입니다.

 

Because API supports only storing and retrieving of strings to/from SharedPreferences (after API 11, it's simpler), we have to serialize and de-serialize the ArrayList object which has the list of tasks into a string.

API는 SharedPreferences에 대해 문자열의 저장 및 검색만 지원하기 때문에 (API 11 이후에는 더 간단해졌습니다) 할 일 목록을 포함하는 ArrayList 객체를 문자열로 직렬화 및 역직렬화해야 합니다.

 

In the addTask() method of the TaskManagerApplication class, we have to get the instance of the shared preference and then store the serialized ArrayList using the putString() method:

TaskManagerApplication 클래스의 addTask() 메소드에서, 우리는 공유된 Preference 인스턴스를 얻어야 하며, putString() 메소드를 사용하여 직렬화된 ArrayList를 저장해야 합니다.

 

public void addTask(Task t) {
  if (null == currentTasks) {
    currentTasks = new ArrayList<task>();
  }
  currentTasks.add(t);
 
  // save the task list to preference
  SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);
  Editor editor = prefs.edit();
  try {
    editor.putString(TASKS, ObjectSerializer.serialize(currentTasks));
  } catch (IOException e) {
    e.printStackTrace();
  }
  editor.commit();
}

Similarly we have to retrieve the list of tasks from the preference in the onCreate() method:

마찬가지로, onCreate() 메소드에서 preference에서 작업 목록을 검색해야 합니다.

 

public void onCreate() {
  super.onCreate();
  if (null == currentTasks) {
    currentTasks = new ArrayList<task>();
  }
 
  // load tasks from preference
  SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);
 
  try {
    currentTasks = (ArrayList<task>) ObjectSerializer.deserialize(prefs.getString(TASKS, ObjectSerializer.serialize(new ArrayList<task>())));
  } catch (IOException e) {
    e.printStackTrace();
  } catch (ClassNotFoundException e) {
    e.printStackTrace();
  }
}

You can get the ObjectSerializer class from the Apache Pig project ObjectSerializer.java

Apache Pig 프로젝트의 ObjectSerializer.java에서 ObjectSerializer 클래스를 가져올 수 있습니다.

 

 

 

 가장 최근 달린 Solution 

For String, int, boolean, the best choice would be sharedPreferences.

문자열, 정수, 부울형 데이터의 경우, 가장 좋은 선택은 SharedPreferences입니다.

 

If you want to store ArrayList or any complex data. The best choice would be Paper library.

만약 ArrayList나 어떤 복잡한 데이터를 저장하려면, 가장 좋은 선택은 Paper 라이브러리입니다.

 

Add dependency

의존성(dependency) 추가
implementation 'io.paperdb:paperdb:2.6'

 

Initialize Paper

Paper를 초기화하세요.

 

Should be initialized once in Application.onCreate():

한 번 Application.onCreate()에서 초기화해야합니다.
Paper.init(context);

 

Save

해당 문장은 명령어나 문맥이 없어서 어떤 것을 저장할 지 명확하지 않습니다. 추가적인 정보를 제공해주시면 더 나은 번역을 제공해드릴 수 있습니다.
List<Person> contacts = ...
Paper.book().write("contacts", contacts);

 

Loading Data

데이터 로딩

 

Use default values if object doesn't exist in the storage.

만약 저장소에 해당 객체가 없을 경우, 기본값을 사용하세요.
List<Person> contacts = Paper.book().read("contacts", new ArrayList<>());

 

Here you go.

여기 있습니다.

 

https://github.com/pilgr/Paper

 

 

 

출처 : https://stackoverflow.com/questions/7057845/save-arraylist-to-sharedpreferences

반응형
댓글
공지사항
최근에 올라온 글