티스토리 뷰
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
'개발 > 안드로이드' 카테고리의 다른 글
Parcelable encountered IOException 오류 해결하기 (0) | 2023.01.19 |
---|---|
전화 걸기 앱에서 특정 전화번호가 표시되도록 하기 (0) | 2023.01.18 |
Android Fragment 에서 뒤로 가기 버튼 처리하기 (0) | 2023.01.16 |
Android에서 URI Builder 사용 또는 변수가 있는 URL 생성 (0) | 2023.01.15 |
안드로이드에서 전체 히스토리 스택을 지우고 새로운 액티비티를 시작하는 방법 (0) | 2023.01.14 |