SharedPreferences에 ArrayList 저장


317

나는이 ArrayList사용자 정의 객체. 각 사용자 정의 개체는 다양한 문자열과 숫자를 포함합니다. 사용자가 액티비티를 떠났다가 나중에 다시 돌아와도 배열을 고수해야하지만 응용 프로그램이 완전히 닫힌 후에는 사용 가능한 배열이 필요하지 않습니다. 나는 이것을 사용하여 다른 많은 객체를 이런 식 SharedPreferences으로 저장하지만 전체 배열을 이런 식으로 저장하는 방법을 알 수 없습니다. 이게 가능해? 어쩌면 SharedPreferences이것에 대해 갈 길이 아닌가? 더 간단한 방법이 있습니까?


여기서 답변을 찾을 수 있습니다 : stackoverflow.com/questions/14981233/…
Apurva Kolapkar

이것은 완전한 예제입니다 URL stackoverflow.com/a/41137562/4344659
Sanjeev Sangral

누군가 솔루션을 찾고 있다면 이것이 kotlin의 전체 사용 예를 찾고있는 대답 일 수 있습니다. stackoverflow.com/a/56873719/3710341
Sagar Chapagain

답변:


431

API 11 이후 SharedPreferences Editor수락Sets . 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();

또한 직렬화 ArrayList한 다음에 저장하거나 읽을 수 있습니다 SharedPreferences. 아래는 해결책입니다.

편집하다:
아래는 ArrayList직렬화 된 객체로 저장 SharedPreferences한 다음 SharedPreferences에서 읽는 솔루션 입니다.

API는 SharedPreferences와의 문자열 저장 및 검색 만 지원하기 때문에 (API 11 이후에는 단순함), 작업 목록이있는 ArrayList 객체를 문자열로 직렬화하고 역 직렬화해야합니다.

addTask()TaskManagerApplication 클래스 의 메소드에서 공유 환경 설정의 인스턴스를 가져온 다음 직렬화 된 ArrayList를 사용하여 저장해야합니다.putString() 메소드를 .

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();
}

마찬가지로 onCreate()메소드 의 환경 설정에서 작업 목록을 검색해야합니다 .

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();
  }
}

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


21
명심 putStringSetAPI 11. 현재 대부분의 프로그래머 하였다는 임대 API 8 (프로 요)에서 대상.
Cristian

2
가장 깨끗한 것처럼 보이기 때문에이 방법에 대한 아이디어가 마음에 들지만 저장하려는 배열은 문자열, 이중 및 부울을 포함하는 사용자 정의 클래스 객체입니다. 이 세 가지 유형을 모두 세트에 추가하려면 어떻게해야합니까? 저장하기 전에 모든 개별 객체를 자체 배열로 설정 한 다음 개별 세트를 개별 세트에 추가해야합니까, 아니면 더 간단한 방법이 있습니까?
ryandlf

5
무엇입니까 scoreEditor?
Ruchir Baronia

2
2016 년 10 월 이후 독자에게 :이 의견은 이미 많은 찬사를 받고 있으며 나처럼 사용할 수도 있지만 중단하고 그렇게하지 마십시오. HashSet은 중복 값을 삭제하므로 ArrayList가 동일하지 않습니다. 자세한 내용은 여기 : stackoverflow.com/questions/12940663/…
seoul

2
이 답변을 오는 사람들에게 상기시켜줍니다. Set은 순서가 없으므로 StringSet을 저장하면 ArrayList와의 순서가 손실됩니다.
David Liu

119

TinyDB--Android-Shared-Preferences-Turbo 이 객체를 사용하면 매우 간단합니다.

TinyDB tinydb = new TinyDB(context);

놓다

tinydb.putList("MyUsers", mUsersArray);

얻을

tinydb.getList("MyUsers");

최신 정보

몇 가지 유용한 예제와 문제 해결은 여기에서 찾을 수 있습니다. Android 공유 환경 설정 TinyDB putListObject frunction


6
이것이 가장 좋은 방법입니다. 내 편에서 +1
Sritam Jagadev 9

3
나도. 매우 유용한 !!
Juan Aguilar Guisado 2016 년

1
목록의 내용에 따라 호출 할 때 목록의 객체 유형을 지정해야합니다 tinydb.putList(). 링크 된 페이지에서 예제를보십시오.
kc ochibili

좋은 라이브러리이지만 객체를 저장할 때이 라이브러리에 문제가 있음을 언급해야합니다. 보다 구체적으로 말하자면 스택 오버플로 예외가 발생할 수 있습니다. 객체를 저장하는 방법을 파악하기 위해 반사를 사용하기 때문에 객체가 너무 복잡해지면 예외가 발생할 수 있다고 생각합니다.
Mr.Q

1
당신을 너무 사랑합니다!
mychemicalro

93

저장 Array에서 SharedPreferences:

public static boolean saveArray()
{
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor mEdit1 = sp.edit();
    /* sKey is an array */
    mEdit1.putInt("Status_size", sKey.size());  

    for(int i=0;i<sKey.size();i++)  
    {
        mEdit1.remove("Status_" + i);
        mEdit1.putString("Status_" + i, sKey.get(i));  
    }

    return mEdit1.commit();     
}

Array데이터 로드SharedPreferences

public static void loadArray(Context mContext)
{  
    SharedPreferences mSharedPreference1 =   PreferenceManager.getDefaultSharedPreferences(mContext);
    sKey.clear();
    int size = mSharedPreference1.getInt("Status_size", 0);  

    for(int i=0;i<size;i++) 
    {
     sKey.add(mSharedPreference1.getString("Status_" + i, null));
    }

}

14
이것은 매우 좋은 "해킹"입니다. 이 방법을 사용하면 항상 사용하지 않는 이전 값으로 SharedPreferences를 부 풀릴 가능성이 있습니다. 예를 들어, 실행시 목록의 크기는 100이고 크기는 50입니다. 50 개의 이전 항목은 기본 설정으로 유지됩니다. 한 가지 방법은 MAX 값을 설정하고 그 이상을 지우는 것입니다.
Iraklis

3
@Iraklis 사실,하지만 당신 만이 저장하는 것이 가정 ArrayListSharedPrefeneces당신이 사용할 수있는 mEdit1.clear()이 문제를 방지 할 수 있습니다.
AlexAndro

1
나는이 "핵"을 좋아한다. 그러나 mEdit1.clear ()는이 목적과 관련이없는 다른 값을 지울까요?
Bagusflyer

1
감사! 물어 보시면 .remove ()에 필요한 목적이 있습니까? 어쨌든 환경 설정이 덮어 쓰지 않습니까?
Script Kitty

62

로 변환 JSON String하여 문자열을에 저장할 수 있습니다 SharedPreferences.


ArrayLists를 JSONArrays로 변환하는 데 많은 코드가 있지만 SharedPrefs에 저장할 수 있도록 JSONString으로 변환하는 방법에 대해 공유하고자하는 샘플이 있습니까?
ryandlf

5
사용 toString ()
MByD

3
그러나 SharedPrefs에서 다시 가져 와서 ArrayList로 다시 변환하는 방법은 무엇입니까?
ryandlf

죄송합니다. 지금 테스트 할 Android SDK가 없지만 benjii.me/2010/04/deserializing-json-in-android-using-gson 에서 살펴 보십시오 . json 배열을 반복하고 각 객체에 대해 수행하는 작업을 수행해야합니다. 내일 전체 예제를 사용하여 내 답변에 편집 내용을 게시 할 수 있기를 바랍니다.
MByD

53

@nirav가 말했듯이 최상의 솔루션은 Gson 유틸리티 클래스를 사용하여 공유 프리 펀 세스에 json 텍스트로 저장하는 것입니다. 샘플 코드 아래 :

//Retrieve the values
Gson gson = new Gson();
String jsonText = Prefs.getString("key", null);
String[] text = gson.fromJson(jsonText, String[].class);  //EDIT: gso to gson


//Set the values
Gson gson = new Gson();
List<String> textList = new ArrayList<String>();
textList.addAll(data);
String jsonText = gson.toJson(textList);
prefsEditor.putString("key", jsonText);
prefsEditor.apply();

2
생명의 은인 이신 하나님 감사합니다. 실제로 매우 간단합니다.
Parthiban M

2
이 대답은 끝이났다. 훌륭한! 내가 이런 식으로 Gson을 사용할 수 있는지 몰랐습니다. 배열 표기법을 처음 보았을 때도 이런 식으로 사용되었습니다. 감사합니다!
madu

3
다시 List로 변환하려면 List <String> textList = Arrays.asList (gson.fromJson (jsonText, String []. class));
Vamsi Challa

22

이봐 친구 내가 위의 문제를 해결하지 않고 Gson 라이브러리 . 여기에 소스 코드를 게시합니다.

1. 가변 선언 즉

  SharedPreferences shared;
  ArrayList<String> arrPackage;

2. 가변 초기화

 shared = getSharedPreferences("App_settings", MODE_PRIVATE);
 // add values for your ArrayList any where...
 arrPackage = new ArrayList<>();

3. 다음을 사용하여 값을 sharedPreference에 저장하십시오 packagesharedPreferences().

 private void packagesharedPreferences() {
   SharedPreferences.Editor editor = shared.edit();
   Set<String> set = new HashSet<String>();
   set.addAll(arrPackage);
   editor.putStringSet("DATE_LIST", set);
   editor.apply();
   Log.d("storesharedPreferences",""+set);
 }

다음을 사용하여 sharedPreference의 값을 검색하십시오 retriveSharedValue().

 private void retriveSharedValue() {
   Set<String> set = shared.getStringSet("DATE_LIST", null);
   arrPackage.addAll(set);
   Log.d("retrivesharedPreferences",""+set);
 }

나는 그것이 당신에게 도움이되기를 바랍니다 ...


좋은 해결책! 쉽고 빠르게!
LoveAndroid

5
이렇게하면 세트에 추가하자마자 목록에서 모든 중복 문자열이 제거됩니다. 아마도 원치 않는 기능
OneCricketeer

의 목록에만 해당 String됩니까?
CoolMind

당신은 위해이 방법을 잃게됩니다
브라이언 홀트에게

16
/**
 *     Save and get ArrayList in SharedPreference
 */

자바:

public void saveArrayList(ArrayList<String> list, String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
    SharedPreferences.Editor editor = prefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(list);
    editor.putString(key, json);
    editor.apply();    

}

public ArrayList<String> getArrayList(String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
    Gson gson = new Gson();
    String json = prefs.getString(key, null);
    Type type = new TypeToken<ArrayList<String>>() {}.getType();
    return gson.fromJson(json, type);
}

코 틀린

fun saveArrayList(list: java.util.ArrayList<String?>?, key: String?) {
    val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity)
    val editor: Editor = prefs.edit()
    val gson = Gson()
    val json: String = gson.toJson(list)
    editor.putString(key, json)
    editor.apply()
}

fun getArrayList(key: String?): java.util.ArrayList<String?>? {
    val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity)
    val gson = Gson()
    val json: String = prefs.getString(key, null)
    val type: Type = object : TypeToken<java.util.ArrayList<String?>?>() {}.getType()
    return gson.fromJson(json, type)
}

1
예, 가장 좋은 답변
AlexPad

이것은 최고의 답변입니다. 다른 물체도 저장하는 데 사용했습니다
Irfandi D. Vendy

모든 모델 클래스를 저장한다는 의미입니까?
BlackBlind

13

Android SharedPreferances를 사용하면 기본 유형 (부울, 플로트, Int, Long, 문자열 및 StringSet)을 메모리에 xml 파일로 메모리에 저장할 수 있습니다.

솔루션의 핵심 아이디어는 데이터를 이러한 기본 유형 중 하나로 변환하는 것입니다.

개인적으로 내 목록을 json 형식으로 변환 한 다음 SharedPreferences 값에 문자열로 저장하는 것을 좋아합니다.

내 솔루션을 사용하려면 Google Gson 을 추가해야합니다 lib .

gradle에서 다음 종속성을 추가하십시오 (Google의 최신 버전을 사용하십시오).

compile 'com.google.code.gson:gson:2.6.2'

데이터를 저장합니다 (HttpParam이 객체 임) :

List<HttpParam> httpParamList = "**get your list**"
String httpParamJSONList = new Gson().toJson(httpParamList);

SharedPreferences prefs = getSharedPreferences(**"your_prefes_key"**, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(**"your_prefes_key"**, httpParamJSONList);

editor.apply();

데이터 검색 (HttpParam이 객체 임) :

SharedPreferences prefs = getSharedPreferences(**"your_prefes_key"**, Context.MODE_PRIVATE);
String httpParamJSONList = prefs.getString(**"your_prefes_key"**, ""); 

List<HttpParam> httpParamList =  
new Gson().fromJson(httpParamJSONList, new TypeToken<List<HttpParam>>() {
            }.getType());

감사. 이 답변은 내 List <MyObject>를 검색하고 저장하는 데 도움이되었습니다.
visrahane

감사. 잘 작동
Velayutham M

11

이것이 당신의 완벽한 솔루션입니다. 시도해보십시오.

public void saveArrayList(ArrayList<String> list, String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
    SharedPreferences.Editor editor = prefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(list);
    editor.putString(key, json);
    editor.apply();     // This line is IMPORTANT !!!
}

public ArrayList<String> getArrayList(String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
    Gson gson = new Gson();
    String json = prefs.getString(key, null);
    Type type = new TypeToken<ArrayList<String>>() {}.getType();
    return gson.fromJson(json, type);
}

9

또한 arraylist를 String으로 변환하고 환경 설정에 저장할 수 있습니다

private String convertToString(ArrayList<String> list) {

            StringBuilder sb = new StringBuilder();
            String delim = "";
            for (String s : list)
            {
                sb.append(delim);
                sb.append(s);;
                delim = ",";
            }
            return sb.toString();
        }

private ArrayList<String> convertToArray(String string) {

            ArrayList<String> list = new ArrayList<String>(Arrays.asList(string.split(",")));
            return list;
        }

convertToString메소드를 사용하여 Arraylist를 문자열로 변환 한 후 Arraylist를 저장하고 문자열을 검색하여 배열로 변환 할 수 있습니다convertToArray

API 11 후에는 세트를 SharedPreferences에 직접 저장할 수 있습니다 !!! :)


6

String, int, boolean의 경우 최선의 선택은 sharedPreferences입니다.

ArrayList 또는 복잡한 데이터를 저장하려는 경우 최선의 선택은 종이 라이브러리입니다.

의존성 추가

implementation 'io.paperdb:paperdb:2.6'

용지 초기화

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

Paper.init(context);

저장

List<Person> contacts = ...
Paper.book().write("contacts", contacts);

데이터 로딩

스토리지에 오브젝트가없는 경우 기본값을 사용하십시오.

List<Person> contacts = Paper.book().read("contacts", new ArrayList<>());

여기 요

https://github.com/pilgr/Paper


5

위의 모든 답변을 읽었습니다. 그것은 모두 정확하지만 다음과 같이 더 쉬운 해결책을 찾았습니다.

  1. 공유 환경 설정에서 문자열 목록 저장 >>

    public static void setSharedPreferenceStringList(Context pContext, String pKey, List<String> pData) {
    SharedPreferences.Editor editor = pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).edit();
    editor.putInt(pKey + "size", pData.size());
    editor.commit();
    
    for (int i = 0; i < pData.size(); i++) {
        SharedPreferences.Editor editor1 = pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).edit();
        editor1.putString(pKey + i, (pData.get(i)));
        editor1.commit();
    }

    }

  2. 공유 환경 설정에서 문자열 목록 가져 오기 >>

    public static List<String> getSharedPreferenceStringList(Context pContext, String pKey) {
    int size = pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).getInt(pKey + "size", 0);
    List<String> list = new ArrayList<>();
    for (int i = 0; i < size; i++) {
        list.add(pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).getString(pKey + i, ""));
    }
    return list;
    }

Constants.APP_PREFS열 파일의 이름은 다음과 같습니다 . 경로 구분 기호를 포함 할 수 없습니다.


5

Kotlin과 함께 :

fun SharedPreferences.Editor.putIntegerArrayList(key: String, list: ArrayList<Int>?): SharedPreferences.Editor {
    putString(key, list?.joinToString(",") ?: "")
    return this
}

fun SharedPreferences.getIntegerArrayList(key: String, defValue: ArrayList<Int>?): ArrayList<Int>? {
    val value = getString(key, null)
    if (value.isNullOrBlank())
        return defValue
    return ArrayList (value.split(",").map { it.toInt() }) 
}

4

가장 좋은 방법은 GSON을 사용하여 JSOn 문자열로 변환하고이 문자열을 SharedPreference에 저장하는 것입니다. 또한이 방법을 사용하여 응답을 캐시합니다.


4

Gson 라이브러리를 사용하여 문자열 및 사용자 정의 배열 목록을 저장할 수 있습니다.

=> 먼저 배열 목록을 SharedPreferences에 저장하는 함수를 만들어야합니다.

public void saveListInLocal(ArrayList<String> list, String key) {

        SharedPreferences prefs = getSharedPreferences("AppName", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        Gson gson = new Gson();
        String json = gson.toJson(list);
        editor.putString(key, json);
        editor.apply();     // This line is IMPORTANT !!!

    }

=> SharedPreferences에서 배열 목록을 얻으려면 함수를 만들어야합니다.

public ArrayList<String> getListFromLocal(String key)
{
    SharedPreferences prefs = getSharedPreferences("AppName", Context.MODE_PRIVATE);
    Gson gson = new Gson();
    String json = prefs.getString(key, null);
    Type type = new TypeToken<ArrayList<String>>() {}.getType();
    return gson.fromJson(json, type);

}

=> 저장 및 검색 배열 목록 함수를 호출하는 방법.

ArrayList<String> listSave=new ArrayList<>();
listSave.add("test1"));
listSave.add("test2"));
saveListInLocal(listSave,"key");
Log.e("saveArrayList:","Save ArrayList success");
ArrayList<String> listGet=new ArrayList<>();
listGet=getListFromLocal("key");
Log.e("getArrayList:","Get ArrayList size"+listGet.size());

=> 앱 레벨 build.gradle에 gson 라이브러리를 추가하는 것을 잊지 마십시오.

구현 'com.google.code.gson : gson : 2.8.2'


3

FacebookSDK의 SharedPreferencesTokenCache 클래스에서 serializeKey () 및 deserializeKey () 함수를 참조 할 수 있습니다. supportedType을 JSON 객체로 변환하고 JSON 문자열을 SharedPreferences에 저장합니다 . 여기 에서 SDK를 다운로드 할 수 있습니다

private void serializeKey(String key, Bundle bundle, SharedPreferences.Editor editor)
    throws JSONException {
    Object value = bundle.get(key);
    if (value == null) {
        // Cannot serialize null values.
        return;
    }

    String supportedType = null;
    JSONArray jsonArray = null;
    JSONObject json = new JSONObject();

    if (value instanceof Byte) {
        supportedType = TYPE_BYTE;
        json.put(JSON_VALUE, ((Byte)value).intValue());
    } else if (value instanceof Short) {
        supportedType = TYPE_SHORT;
        json.put(JSON_VALUE, ((Short)value).intValue());
    } else if (value instanceof Integer) {
        supportedType = TYPE_INTEGER;
        json.put(JSON_VALUE, ((Integer)value).intValue());
    } else if (value instanceof Long) {
        supportedType = TYPE_LONG;
        json.put(JSON_VALUE, ((Long)value).longValue());
    } else if (value instanceof Float) {
        supportedType = TYPE_FLOAT;
        json.put(JSON_VALUE, ((Float)value).doubleValue());
    } else if (value instanceof Double) {
        supportedType = TYPE_DOUBLE;
        json.put(JSON_VALUE, ((Double)value).doubleValue());
    } else if (value instanceof Boolean) {
        supportedType = TYPE_BOOLEAN;
        json.put(JSON_VALUE, ((Boolean)value).booleanValue());
    } else if (value instanceof Character) {
        supportedType = TYPE_CHAR;
        json.put(JSON_VALUE, value.toString());
    } else if (value instanceof String) {
        supportedType = TYPE_STRING;
        json.put(JSON_VALUE, (String)value);
    } else {
        // Optimistically create a JSONArray. If not an array type, we can null
        // it out later
        jsonArray = new JSONArray();
        if (value instanceof byte[]) {
            supportedType = TYPE_BYTE_ARRAY;
            for (byte v : (byte[])value) {
                jsonArray.put((int)v);
            }
        } else if (value instanceof short[]) {
            supportedType = TYPE_SHORT_ARRAY;
            for (short v : (short[])value) {
                jsonArray.put((int)v);
            }
        } else if (value instanceof int[]) {
            supportedType = TYPE_INTEGER_ARRAY;
            for (int v : (int[])value) {
                jsonArray.put(v);
            }
        } else if (value instanceof long[]) {
            supportedType = TYPE_LONG_ARRAY;
            for (long v : (long[])value) {
                jsonArray.put(v);
            }
        } else if (value instanceof float[]) {
            supportedType = TYPE_FLOAT_ARRAY;
            for (float v : (float[])value) {
                jsonArray.put((double)v);
            }
        } else if (value instanceof double[]) {
            supportedType = TYPE_DOUBLE_ARRAY;
            for (double v : (double[])value) {
                jsonArray.put(v);
            }
        } else if (value instanceof boolean[]) {
            supportedType = TYPE_BOOLEAN_ARRAY;
            for (boolean v : (boolean[])value) {
                jsonArray.put(v);
            }
        } else if (value instanceof char[]) {
            supportedType = TYPE_CHAR_ARRAY;
            for (char v : (char[])value) {
                jsonArray.put(String.valueOf(v));
            }
        } else if (value instanceof List<?>) {
            supportedType = TYPE_STRING_LIST;
            @SuppressWarnings("unchecked")
            List<String> stringList = (List<String>)value;
            for (String v : stringList) {
                jsonArray.put((v == null) ? JSONObject.NULL : v);
            }
        } else {
            // Unsupported type. Clear out the array as a precaution even though
            // it is redundant with the null supportedType.
            jsonArray = null;
        }
    }

    if (supportedType != null) {
        json.put(JSON_VALUE_TYPE, supportedType);
        if (jsonArray != null) {
            // If we have an array, it has already been converted to JSON. So use
            // that instead.
            json.putOpt(JSON_VALUE, jsonArray);
        }

        String jsonString = json.toString();
        editor.putString(key, jsonString);
    }
}

private void deserializeKey(String key, Bundle bundle)
        throws JSONException {
    String jsonString = cache.getString(key, "{}");
    JSONObject json = new JSONObject(jsonString);

    String valueType = json.getString(JSON_VALUE_TYPE);

    if (valueType.equals(TYPE_BOOLEAN)) {
        bundle.putBoolean(key, json.getBoolean(JSON_VALUE));
    } else if (valueType.equals(TYPE_BOOLEAN_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        boolean[] array = new boolean[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = jsonArray.getBoolean(i);
        }
        bundle.putBooleanArray(key, array);
    } else if (valueType.equals(TYPE_BYTE)) {
        bundle.putByte(key, (byte)json.getInt(JSON_VALUE));
    } else if (valueType.equals(TYPE_BYTE_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        byte[] array = new byte[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = (byte)jsonArray.getInt(i);
        }
        bundle.putByteArray(key, array);
    } else if (valueType.equals(TYPE_SHORT)) {
        bundle.putShort(key, (short)json.getInt(JSON_VALUE));
    } else if (valueType.equals(TYPE_SHORT_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        short[] array = new short[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = (short)jsonArray.getInt(i);
        }
        bundle.putShortArray(key, array);
    } else if (valueType.equals(TYPE_INTEGER)) {
        bundle.putInt(key, json.getInt(JSON_VALUE));
    } else if (valueType.equals(TYPE_INTEGER_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        int[] array = new int[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = jsonArray.getInt(i);
        }
        bundle.putIntArray(key, array);
    } else if (valueType.equals(TYPE_LONG)) {
        bundle.putLong(key, json.getLong(JSON_VALUE));
    } else if (valueType.equals(TYPE_LONG_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        long[] array = new long[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = jsonArray.getLong(i);
        }
        bundle.putLongArray(key, array);
    } else if (valueType.equals(TYPE_FLOAT)) {
        bundle.putFloat(key, (float)json.getDouble(JSON_VALUE));
    } else if (valueType.equals(TYPE_FLOAT_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        float[] array = new float[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = (float)jsonArray.getDouble(i);
        }
        bundle.putFloatArray(key, array);
    } else if (valueType.equals(TYPE_DOUBLE)) {
        bundle.putDouble(key, json.getDouble(JSON_VALUE));
    } else if (valueType.equals(TYPE_DOUBLE_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        double[] array = new double[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            array[i] = jsonArray.getDouble(i);
        }
        bundle.putDoubleArray(key, array);
    } else if (valueType.equals(TYPE_CHAR)) {
        String charString = json.getString(JSON_VALUE);
        if (charString != null && charString.length() == 1) {
            bundle.putChar(key, charString.charAt(0));
        }
    } else if (valueType.equals(TYPE_CHAR_ARRAY)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        char[] array = new char[jsonArray.length()];
        for (int i = 0; i < array.length; i++) {
            String charString = jsonArray.getString(i);
            if (charString != null && charString.length() == 1) {
                array[i] = charString.charAt(0);
            }
        }
        bundle.putCharArray(key, array);
    } else if (valueType.equals(TYPE_STRING)) {
        bundle.putString(key, json.getString(JSON_VALUE));
    } else if (valueType.equals(TYPE_STRING_LIST)) {
        JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
        int numStrings = jsonArray.length();
        ArrayList<String> stringList = new ArrayList<String>(numStrings);
        for (int i = 0; i < numStrings; i++) {
            Object jsonStringValue = jsonArray.get(i);
            stringList.add(i, jsonStringValue == JSONObject.NULL ? null : (String)jsonStringValue);
        }
        bundle.putStringArrayList(key, stringList);
    }
}

2

배열 목록을 Application 클래스에 고정시키지 않는 이유는 무엇입니까? 앱이 실제로 죽었을 때만 파괴 되므로 앱을 사용할 수있는 한 계속 멈출 것입니다.


5
응용 프로그램을 다시 시작하면 어떻게됩니까?
Manohar Perepa

2

내가 찾은 가장 좋은 방법은 키의 2D 배열을 만들고 배열의 사용자 정의 항목을 키의 2D 배열에 넣은 다음 시작할 때 2D arra를 통해 검색하는 것입니다. 대부분의 안드로이드 사용자가 여전히 진저 브레드에 있고 문자열 세트를 사용하려면 벌집이 필요하기 때문에 문자열 세트를 사용하는 아이디어가 마음에 들지 않았습니다.

샘플 코드 : 여기 ditor는 공유 준비 편집기이고 rowitem은 내 사용자 정의 객체입니다.

editor.putString(genrealfeedkey[j][1], Rowitemslist.get(j).getname());
        editor.putString(genrealfeedkey[j][2], Rowitemslist.get(j).getdescription());
        editor.putString(genrealfeedkey[j][3], Rowitemslist.get(j).getlink());
        editor.putString(genrealfeedkey[j][4], Rowitemslist.get(j).getid());
        editor.putString(genrealfeedkey[j][5], Rowitemslist.get(j).getmessage());

2

다음 코드는 예를 들어 새로운 사람들 (me)을위한 몇 줄 더 허용되는 대답입니다. set 유형 객체를 arrayList로 다시 변환하는 방법과 '.putStringSet'및 '.getStringSet'이전에 대한 추가 지침을 보여줍니다. (감사합니다)

// shared preferences
   private SharedPreferences preferences;
   private SharedPreferences.Editor nsuserdefaults;

// setup persistent data
        preferences = this.getSharedPreferences("MyPreferences", MainActivity.MODE_PRIVATE);
        nsuserdefaults = preferences.edit();

        arrayOfMemberUrlsUserIsFollowing = new ArrayList<String>();
        //Retrieve followers from sharedPreferences
        Set<String> set = preferences.getStringSet("following", null);

        if (set == null) {
            // lazy instantiate array
            arrayOfMemberUrlsUserIsFollowing = new ArrayList<String>();
        } else {
            // there is data from previous run
            arrayOfMemberUrlsUserIsFollowing = new ArrayList<>(set);
        }

// convert arraylist to set, and save arrayOfMemberUrlsUserIsFollowing to nsuserdefaults
                Set<String> set = new HashSet<String>();
                set.addAll(arrayOfMemberUrlsUserIsFollowing);
                nsuserdefaults.putStringSet("following", set);
                nsuserdefaults.commit();

2
//Set the values
intent.putParcelableArrayListExtra("key",collection);

//Retrieve the values
ArrayList<OnlineMember> onlineMembers = data.getParcelableArrayListExtra("key");


2

직렬화 또는 Gson 라이브러리를 사용하여 목록을 문자열로 또는 그 반대로 변환 한 다음 환경 설정에 문자열을 저장할 수 있습니다.

구글의 Gson 라이브러리 사용하기 :

//Converting list to string
new Gson().toJson(list);

//Converting string to list
new Gson().fromJson(listString, CustomObjectsList.class);

Java 직렬화 사용 :

//Converting list to string
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(list);
oos.flush();
String string = Base64.encodeToString(bos.toByteArray(), Base64.DEFAULT);
oos.close();
bos.close();
return string;

//Converting string to list
byte[] bytesArray = Base64.decode(familiarVisitsString, Base64.DEFAULT);
ByteArrayInputStream bis = new ByteArrayInputStream(bytesArray);
ObjectInputStream ois = new ObjectInputStream(bis);
Object clone = ois.readObject();
ois.close();
bis.close();
return (CustomObjectsList) clone;

2

이 방법은 배열 목록을 저장 / 저장하는 데 사용됩니다.

 public static void saveSharedPreferencesLogList(Context context, List<String> collageList) {
            SharedPreferences mPrefs = context.getSharedPreferences("PhotoCollage", context.MODE_PRIVATE);
            SharedPreferences.Editor prefsEditor = mPrefs.edit();
            Gson gson = new Gson();
            String json = gson.toJson(collageList);
            prefsEditor.putString("myJson", json);
            prefsEditor.commit();
        }

이 방법은 배열 목록을 검색하는 데 사용됩니다.

public static List<String> loadSharedPreferencesLogList(Context context) {
        List<String> savedCollage = new ArrayList<String>();
        SharedPreferences mPrefs = context.getSharedPreferences("PhotoCollage", context.MODE_PRIVATE);
        Gson gson = new Gson();
        String json = mPrefs.getString("myJson", "");
        if (json.isEmpty()) {
            savedCollage = new ArrayList<String>();
        } else {
            Type type = new TypeToken<List<String>>() {
            }.getType();
            savedCollage = gson.fromJson(json, type);
        }

        return savedCollage;
    }

1

이를 Map저장 하기 위해 Object 로 변환 한 다음을 검색 할 때 값을 ArrayList로 다시 변경할 수 있습니다 SharedPreferences.


1

이 사용자 정의 클래스를 사용하십시오.

public class SharedPreferencesUtil {

    public static void pushStringList(SharedPreferences sharedPref, 
                                      List<String> list, String uniqueListName) {

        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putInt(uniqueListName + "_size", list.size());

        for (int i = 0; i < list.size(); i++) {
            editor.remove(uniqueListName + i);
            editor.putString(uniqueListName + i, list.get(i));
        }
        editor.apply();
    }

    public static List<String> pullStringList(SharedPreferences sharedPref, 
                                              String uniqueListName) {

        List<String> result = new ArrayList<>();
        int size = sharedPref.getInt(uniqueListName + "_size", 0);

        for (int i = 0; i < size; i++) {
            result.add(sharedPref.getString(uniqueListName + i, null));
        }
        return result;
    }
}

사용하는 방법:

SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
SharedPreferencesUtil.pushStringList(sharedPref, list, getString(R.string.list_name));
List<String> list = SharedPreferencesUtil.pullStringList(sharedPref, getString(R.string.list_name));

1

이것은 작동해야합니다 :

public void setSections (Context c,  List<Section> sectionList){
    this.sectionList = sectionList;

    Type sectionListType = new TypeToken<ArrayList<Section>>(){}.getType();
    String sectionListString = new Gson().toJson(sectionList,sectionListType);

    SharedPreferences.Editor editor = getSharedPreferences(c).edit().putString(PREFS_KEY_SECTIONS, sectionListString);
    editor.apply();
}

그것을 잡기 위해 :

public List<Section> getSections(Context c){

    if(this.sectionList == null){
        String sSections = getSharedPreferences(c).getString(PREFS_KEY_SECTIONS, null);

        if(sSections == null){
            return new ArrayList<>();
        }

        Type sectionListType = new TypeToken<ArrayList<Section>>(){}.getType();
        try {

            this.sectionList = new Gson().fromJson(sSections, sectionListType);

            if(this.sectionList == null){
                return new ArrayList<>();
            }
        }catch (JsonSyntaxException ex){

            return new ArrayList<>();

        }catch (JsonParseException exc){

            return new ArrayList<>();
        }
    }
    return this.sectionList;
}

그것은 나를 위해 작동합니다.


1

저장 목록에 대한 utils 클래스 SharedPreferences

public class SharedPrefApi {
    private SharedPreferences sharedPreferences;
    private Gson gson;

    public SharedPrefApi(Context context, Gson gson) {
        this.sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        this.gson = gson;
    } 

    ...

    public <T> void putList(String key, List<T> list) {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(key, gson.toJson(list));
        editor.apply();
    }

    public <T> List<T> getList(String key, Class<T> clazz) {
        Type typeOfT = TypeToken.getParameterized(List.class, clazz).getType();
        return gson.fromJson(getString(key, null), typeOfT);
    }
}

사용

// for save
sharedPrefApi.putList(SharedPrefApi.Key.USER_LIST, userList);

// for retrieve
List<User> userList = sharedPrefApi.getList(SharedPrefApi.Key.USER_LIST, User.class);

.
내 유틸리티의 전체 코드 // 활동 코드의 예제를 사용하여 확인


1

문자열을 저장하고 검색하는 것과 같은 방식을 사용했지만 여기서는 arrayList와 함께 HashSet을 중재자로 사용했습니다.

arrayList를 SharedPreferences에 저장하기 위해 HashSet을 사용합니다 :

1- SharedPreferences 변수를 만듭니다 (배열이 변경되는 위치)

2-arrayList를 HashSet으로 변환

3-그런 다음 stringSet을 넣고 적용

4-HashSet 내에서 StringSet를 가져오고 ArrayList를 다시 작성하여 HashSet을 설정하십시오.

public class MainActivity extends AppCompatActivity {
    ArrayList<String> arrayList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SharedPreferences prefs = this.getSharedPreferences("com.example.nec.myapplication", Context.MODE_PRIVATE);

        HashSet<String> set = new HashSet(arrayList);
        prefs.edit().putStringSet("names", set).apply();


        set = (HashSet<String>) prefs.getStringSet("names", null);
        arrayList = new ArrayList(set);

        Log.i("array list", arrayList.toString());
    }
}

0
    public  void saveUserName(Context con,String username)
    {
        try
        {
            usernameSharedPreferences= PreferenceManager.getDefaultSharedPreferences(con);
            usernameEditor = usernameSharedPreferences.edit();
            usernameEditor.putInt(PREFS_KEY_SIZE,(USERNAME.size()+1)); 
            int size=USERNAME.size();//USERNAME is arrayList
            usernameEditor.putString(PREFS_KEY_USERNAME+size,username);
            usernameEditor.commit();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }
    public void loadUserName(Context con)
    {  
        try
        {
            usernameSharedPreferences= PreferenceManager.getDefaultSharedPreferences(con);
            size=usernameSharedPreferences.getInt(PREFS_KEY_SIZE,size);
            USERNAME.clear();
            for(int i=0;i<size;i++)
            { 
                String username1="";
                username1=usernameSharedPreferences.getString(PREFS_KEY_USERNAME+i,username1);
                USERNAME.add(username1);
            }
            usernameArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, USERNAME);
            username.setAdapter(usernameArrayAdapter);
            username.setThreshold(0);

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

0

위의 모든 답변이 정확합니다. :) 나는 내 상황을 위해이 중 하나를 사용했다. 그러나 질문을 읽을 때 OP가 잘못되지 않으면 OP가 실제로이 게시물의 제목과 다른 시나리오에 대해 이야기하고 있음을 발견했습니다.

"사용자가 활동을 떠났다가 나중에 다시 방문하고 싶더라도 배열을 고수해야합니다."

그는 실제로 응용 프로그램 내에서 화면을 변경하는 것과 관계없이 앱이 열릴 때까지 데이터를 저장하기를 원합니다.

"하지만 응용 프로그램을 완전히 닫은 후 사용 가능한 배열이 필요하지 않습니다"

그러나 일단 응용 프로그램이 닫히면 데이터를 보존해서는 안됩니다. SharedPreferences 것이 최적의 방법은 아닙니다.

이 요구 사항에 대해 할 수있는 일은 클래스를 확장하는 클래스를 만드는 것 Application입니다.

public class MyApp extends Application {

    //Pardon me for using global ;)

    private ArrayList<CustomObject> globalArray;

    public void setGlobalArrayOfCustomObjects(ArrayList<CustomObject> newArray){
        globalArray = newArray; 
    }

    public ArrayList<CustomObject> getGlobalArrayOfCustomObjects(){
        return globalArray;
    }

}

setter 및 getter를 사용하면 Application을 사용하여 어디서나 ArrayList에 액세스 할 수 있습니다. 그리고 가장 중요한 부분은 앱이 닫히면 데이터가 저장되는 것에 대해 걱정할 필요가 없습니다. :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.