Simpan ArrayList ke SharedPreferences

318

Saya punya ArrayListdengan objek khusus. Setiap objek khusus berisi berbagai string dan angka. Saya perlu array untuk tetap bertahan bahkan jika pengguna meninggalkan aktivitas dan kemudian ingin kembali lagi nanti, namun saya tidak perlu array tersedia setelah aplikasi telah ditutup sepenuhnya. Saya menyimpan banyak objek lain dengan cara ini dengan menggunakan SharedPreferencestetapi saya tidak tahu bagaimana cara menyimpan seluruh array saya dengan cara ini. Apakah ini mungkin? Mungkin SharedPreferencesbukan cara untuk menyelesaikan ini? Apakah ada metode yang lebih sederhana?

ryandlf
sumber
Anda dapat menemukan Jawab di sini: stackoverflow.com/questions/14981233/…
Apurva Kolapkar
ini adalah contoh lengkapnya melalui url stackoverflow.com/a/41137562/4344659
Sanjeev Sangral
Jika ada yang mencari solusinya, ini mungkin jawaban yang Anda cari dengan contoh penggunaan penuh di kotlin. stackoverflow.com/a/56873719/3710341
Sagar Chapagain

Jawaban:

432

Setelah API 11 SharedPreferences Editormenerima Sets. Anda dapat mengubah Daftar Anda menjadi HashSetsesuatu yang serupa dan menyimpannya seperti itu. Ketika Anda membacanya kembali, ubah menjadi ArrayList, urutkan jika perlu dan Anda siap melakukannya.

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

Anda juga dapat membuat cerita bersambung dari Anda ArrayListdan kemudian menyimpan / membacanya ke / dari SharedPreferences. Di bawah ini solusinya:

EDIT:
Ok, di bawah ini adalah solusi untuk menyimpan ArrayListobjek serial SharedPreferencesdan kemudian membacanya dari SharedPreferences.

Karena API hanya mendukung penyimpanan dan pengambilan string ke / dari SharedPreferences (setelah API 11, lebih sederhana), kita harus membuat cerita bersambung dan menghilangkan urutan objek ArrayList yang memiliki daftar tugas menjadi string.

Dalam addTask()metode kelas TaskManagerApplication, kita harus mendapatkan instance dari preferensi bersama dan kemudian menyimpan ArrayList serial menggunakan putString()metode:

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

Demikian pula kita harus mengambil daftar tugas dari preferensi dalam onCreate()metode:

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

Anda bisa mendapatkan ObjectSerializerkelas dari proyek Apache Pig ObjectSerializer.java

yang jahat
sumber
21
Perlu diingat bahwa putStringSetditambahkan di API 11. Sebagian besar programer saat ini menargetkan sewa API 8 (Froyo).
Cristian
2
Saya suka ide metode ini karena tampaknya menjadi yang terbersih, tetapi array yang saya cari untuk disimpan adalah objek kelas kustom yang berisi string, ganda, dan boolean. Bagaimana cara saya menambahkan ketiga jenis ini ke satu set? Apakah saya harus mengatur setiap objek individual ke array mereka sendiri dan kemudian menambahkannya secara individual ke set terpisah sebelum saya simpan, atau apakah ada cara yang lebih sederhana?
ryandlf
5
Apa scoreEditor?
Ruchir Baronia
2
Kepada pembaca setelah Oktober-2016: Komentar ini sudah mendapatkan banyak dukungan dan Anda dapat menggunakannya seperti saya, tapi tolong hentikan dan jangan lakukan ini. HashSet akan membuang nilai duplikat, sehingga ArrayList Anda tidak akan sama. Detail di sini: stackoverflow.com/questions/12940663/…
seoul
2
Sebagai pengingat kepada orang-orang yang menemukan jawaban ini: Set tidak berurutan, jadi menyimpan StringSet akan kehilangan urutan yang Anda miliki dengan ArrayList Anda.
David Liu
119

Menggunakan objek ini -> TinyDB - Android-Shared-Preferences-Turbo sangat sederhana.

TinyDB tinydb = new TinyDB(context);

untuk dimasukkan

tinydb.putList("MyUsers", mUsersArray);

mendapatkan

tinydb.getList("MyUsers");

MEMPERBARUI

Beberapa contoh dan pemecahan masalah yang berguna dapat ditemukan di sini: Preferensi Berbagi Android TinyDB putListObject

kc ochibili
sumber
6
Ini adalah Pendekatan terbaik. +1 dari pihak saya
Sritam Jagadev
3
Saya juga. Sangat bermanfaat !!
Juan Aguilar Guisado
1
tergantung pada konten Daftar Anda, Anda harus menentukan jenis objek daftar Anda saat memanggil tinydb.putList()Lihat contoh di halaman yang ditautkan.
kc ochibili
Lib bagus, tetapi saya harus menyebutkan bahwa kadang-kadang perpustakaan ini memiliki masalah ketika menyimpan objek. untuk lebih spesifik, itu mungkin membuang stack overflow exception. dan saya pikir itu karena ia menggunakan refleksi untuk mencari tahu cara menyimpan objek, dan jika objek menjadi terlalu rumit mungkin melemparkan pengecualian itu.
Mr.Q
1
Sangat mencintaimu!
mychemicalro
93

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

Memuat ArrayData dariSharedPreferences

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

}
Harneet Kaur
sumber
14
ini adalah "retasan" yang sangat bagus. Sadarilah bahwa dengan metode ini, selalu ada kemungkinan membengkak SharedPreferences dengan nilai-nilai lama yang tidak digunakan. Misalnya daftar mungkin memiliki ukuran 100 dalam pelarian, dan kemudian ukuran 50. 50 entri lama akan tetap pada preferensi. Salah satu caranya adalah menetapkan nilai MAX dan membersihkan apa pun untuk itu.
Iraklis
3
@Iraklis Memang, tetapi dengan asumsi bahwa Anda hanya menyimpan ini ArrayListke dalam SharedPrefenecesyang dapat Anda gunakan mEdit1.clear()untuk menghindari ini.
AlexAndro
1
Saya suka ini "retas". Tetapi mEdit1.clear () akan menghapus nilai-nilai lain yang tidak relevan dengan tujuan ini?
Bagusflyer
1
Terima kasih! Jika Anda keberatan saya bertanya, apakah ada tujuan yang diperlukan untuk .remove ()? Bukankah preferensi akan hanya menimpa?
Script Kitty
62

Anda dapat mengonversinya ke JSON Stringdan menyimpan string di SharedPreferences.

MByD
sumber
Saya menemukan banyak kode untuk mengonversi ArrayLists ke JSONArrays, tetapi apakah Anda memiliki sampel yang mungkin ingin Anda bagikan tentang cara mengonversi ke JSONString sehingga saya dapat menyimpannya di SharedPrefs?
ryandlf
5
menggunakan toString ()
MByD
3
Tetapi kemudian bagaimana cara mendapatkannya kembali dari SharedPrefs dan mengubahnya kembali menjadi ArrayList?
ryandlf
Maaf, saya tidak memiliki SDK Android untuk mengujinya sekarang, tetapi lihat di sini: benjii.me/2010/04/deserializing-json-in-android-using-gson . Anda harus mengulangi json array dan melakukan apa yang mereka lakukan di sana untuk setiap objek, semoga saya dapat memposting hasil edit untuk jawaban saya dengan contoh lengkap besok.
MByD
53

Seperti yang dikatakan @nirav, solusi terbaik adalah menyimpannya di sharedPrefernces sebagai teks json dengan menggunakan kelas utilitas Gson. Di bawah kode sampel:

//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();
Ayman Al-Absi
sumber
2
Terima kasih Tuhan, itu adalah penyelamat hidup. Memang sangat sederhana.
Parthiban M
2
Jawaban ini harusnya naik. Hebat! Tidak tahu saya bisa menggunakan Gson dengan cara ini. Pertama kali melihat notasi array digunakan dengan cara ini juga. Terima kasih!
madu
3
Untuk mengubahnya kembali ke Daftar, Daftar <String> textList = Arrays.asList (gson.fromJson (jsonText, String []. Class));
Vamsi Challa
22

Hai teman-teman saya mendapat solusi dari masalah di atas tanpa menggunakan Gsonperpustakaan. Di sini saya memposting kode sumber.

Deklarasi 1.Variable yaitu

  SharedPreferences shared;
  ArrayList<String> arrPackage;

Inisialisasi 2.Variabel yaitu

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

Nilai 3.Store ke sharedPreference menggunakan 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);
 }

4. Kembalikan nilai sharedPreference menggunakan retriveSharedValue():

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

Saya harap ini akan membantu Anda ...

sachin pangare
sumber
solusi hebat! mudah dan cepat!
LoveAndroid
5
Ini akan menghapus semua string duplikat dari daftar segera setelah Anda menambah satu set. Mungkin bukan fitur yang diinginkan
OneCricketeer
Apakah hanya untuk daftar Strings?
CoolMind
Anda akan kehilangan pesanan dengan cara ini
Brian Reinhold
16
/**
 *     Save and get ArrayList in SharedPreference
 */

JAWA:

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

Kotlin

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)
}
Raviraj
sumber
1
Ya, jawaban terbaik
AlexPad
ini adalah jawaban terbaik, saya telah menggunakannya untuk menyimpan Objek lain juga
Irfandi D. Vendy
dapatkah Anda membuat ini berarti menyimpan semua model kelas?
BlackBlind
13

Preferensi Android Shared memungkinkan Anda untuk menyimpan tipe primitif (Boolean, Float, Int, Long, String, dan StringSet yang tersedia sejak API11) dalam memori sebagai file xml.

Gagasan kunci dari solusi apa pun adalah mengubah data menjadi salah satu dari tipe primitif tersebut.

Saya pribadi suka mengonversi daftar saya ke format json dan kemudian menyimpannya sebagai String dalam nilai SharedPreferences.

Untuk menggunakan solusi saya, Anda harus menambahkan Google Gson lib.

Secara bertahap tambahkan saja ketergantungan berikut (silakan gunakan versi terbaru google):

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

Simpan data (di mana HttpParam adalah objek Anda):

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

Ambil Data (di mana HttpParam adalah objek Anda):

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());
Avi Levin
sumber
Terima kasih. Jawaban ini membantu saya mengambil dan menyimpan Daftar <MyObject> saya.
visrahane
Terima kasih. Bekerja dengan baik
Velayutham M
11

Ini adalah solusi sempurna Anda .. cobalah,

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);
}
Krishna Vyas
sumber
9

Anda juga dapat mengubah daftar array menjadi sebuah String dan menyimpannya dalam preferensi

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

Anda dapat menyimpan Arraylist setelah mengubahnya menjadi string menggunakan convertToStringmetode dan mengambil string dan mengubahnya menjadi array menggunakanconvertToArray

Setelah API 11, Anda dapat menyimpan set langsung ke SharedPreferences !!! :)

SKT
sumber
6

Untuk String, int, boolean, pilihan terbaik adalah sharedPreferences.

Jika Anda ingin menyimpan ArrayList atau data kompleks apa pun. Pilihan terbaik adalah Pustaka kertas.

Tambahkan ketergantungan

implementation 'io.paperdb:paperdb:2.6'

Inisialisasi Kertas

Harus diinisialisasi sekali di Application.onCreate ():

Paper.init(context);

Menyimpan

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

Memuat data

Gunakan nilai default jika objek tidak ada di penyimpanan.

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

Ini dia

https://github.com/pilgr/Paper

Abdullah Khan
sumber
5

Saya sudah membaca semua jawaban di atas. Itu semua benar tetapi saya menemukan solusi yang lebih mudah seperti di bawah ini:

  1. Menyimpan Daftar String di preferensi bersama >>

    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. dan untuk mendapatkan Daftar String dari preferensi-Bersama >>

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

Ini Constants.APP_PREFSadalah nama file yang akan dibuka; tidak dapat mengandung pemisah jalur.

Khemraj
sumber
5

Juga dengan 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() }) 
}
Andrey Tuzov
sumber
4

Cara terbaik adalah mengonversi ke string JSOn menggunakan GSON dan menyimpan string ini ke SharedPreference. Saya juga menggunakan cara ini untuk menyimpan tanggapan.

Winston
sumber
4

Anda dapat menyimpan String dan daftar larik khusus menggunakan pustaka Gson.

=> Pertama, Anda perlu membuat fungsi untuk menyimpan daftar array ke 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 !!!

    }

=> Anda perlu membuat fungsi untuk mendapatkan daftar array dari 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);

}

=> Cara memanggil menyimpan dan mengambil fungsi daftar array.

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

=> Jangan lupa menambahkan pustaka gson di build.gradle tingkat aplikasi Anda.

implementasi 'com.google.code.gson: gson: 2.8.2'

Paras Santoki
sumber
3

Anda bisa merujuk fungsi serializeKey () dan deserializeKey () dari kelas SharedPreferencesTokenCache FacebookSDK. Itu mengkonversi tipe yang didukung ke objek JSON dan menyimpan string JSON ke SharedPreferences . Anda dapat mengunduh SDK dari sini

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);
    }
}
emeraldhieu
sumber
2

Mengapa Anda tidak menempel daftar array Anda pada kelas Aplikasi? Itu hanya hancur ketika aplikasi benar - benar terbunuh, jadi, itu akan bertahan selama aplikasi tersedia.

Carlos Silva
sumber
5
Bagaimana jika aplikasi itu diluncurkan kembali.
Manohar Perepa
2

Cara terbaik yang saya dapat temukan adalah membuat 2D Array kunci dan meletakkan item kustom dari array dalam 2-D array kunci dan kemudian mengambilnya melalui 2D arra pada startup. Saya tidak menyukai gagasan untuk menggunakan rangkaian string karena sebagian besar pengguna android masih menggunakan Gingerbread dan menggunakan rangkaian string memerlukan honeycomb.

Kode Contoh: di sini ditor adalah editor preferensi bersama dan rowitem adalah objek khusus saya.

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());
Anshul Bansal
sumber
2

kode berikut adalah jawaban yang diterima, dengan beberapa baris lagi untuk orang baru (saya), mis. menunjukkan bagaimana mengkonversi objek tipe set kembali ke arrayList, dan panduan tambahan tentang apa yang terjadi sebelum '.putStringSet' dan '.getStringSet'. (terima kasih evilone)

// 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();
tmr
sumber
2
//Set the values
intent.putParcelableArrayListExtra("key",collection);

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

jangan lupa untuk mengimplementasikan Serializable:

Class dataBean implements Serializable{
 public String name;
}
ArrayList<dataBean> dataBeanArrayList = new ArrayList();

https://stackoverflow.com/a/7635154/4639974

Manuel Schmitzberger
sumber
2

Anda dapat menggunakan serialisasi atau pustaka Gson untuk mengonversi daftar menjadi string dan sebaliknya dan kemudian menyimpan string dalam preferensi.

Menggunakan perpustakaan Google Gson:

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

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

Menggunakan serialisasi 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;
Farhan
sumber
2

Metode ini digunakan untuk menyimpan / menyimpan daftar array: -

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

Metode ini digunakan untuk mengambil daftar array: -

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;
    }
Anil Singhania
sumber
1

Anda bisa mengonversinya menjadi MapObyek untuk menyimpannya, lalu mengubah nilai kembali ke ArrayList ketika Anda mengambil SharedPreferences.

Phil
sumber
1

Gunakan kelas khusus ini:

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

Cara Penggunaan:

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));
Yuliia Ashomok
sumber
1

ini harus bekerja:

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

mereka, untuk menangkapnya saja:

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

ini bekerja untuk saya.

Ruben Caster
sumber
1

Kelas utilitas saya untuk menyimpan daftar 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);
    }
}

Menggunakan

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

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

.
Kode lengkap utils saya // periksa menggunakan contoh dalam kode Kegiatan

Phan Van Linh
sumber
1

Saya menggunakan cara yang sama untuk menyimpan dan mengambil sebuah String tetapi di sini dengan arrayList saya telah menggunakan HashSet sebagai mediator

Untuk menyimpan arrayList ke SharedPreferences, kami menggunakan HashSet:

1- kita membuat variabel SharedPreferences (di tempat perubahan terjadi pada array)

2 - kami mengonversi arrayList menjadi HashSet

3 - lalu kita letakkan stringSet dan terapkan

4 - Anda mendapatkanStringSet dalam HashSet dan membuat ulang ArrayList untuk mengatur 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());
    }
}
NEC
sumber
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();
        }
    }
pengguna4680583
sumber
0

Semua jawaban di atas benar. :) Saya sendiri menggunakan salah satunya untuk situasi saya. Namun ketika saya membaca pertanyaan saya menemukan bahwa OP sebenarnya berbicara tentang skenario yang berbeda dari judul posting ini, jika saya tidak salah.

"Saya perlu array untuk tetap bertahan bahkan jika pengguna meninggalkan aktivitas dan kemudian ingin kembali lagi nanti"

Dia benar-benar ingin data disimpan sampai aplikasi terbuka, terlepas dari perubahan layar pengguna dalam aplikasi.

"Namun saya tidak perlu array tersedia setelah aplikasi telah ditutup sepenuhnya"

Tapi begitu aplikasi ditutup data jangan dilestarikan. Karenanya saya merasa menggunakan SharedPreferences bukan cara yang optimal untuk ini.

Apa yang bisa dilakukan untuk persyaratan ini adalah membuat kelas yang memperluas Applicationkelas.

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

}

Dengan menggunakan setter dan pengambil, ArrayList dapat diakses dari mana saja dengan Aplikasi. Dan bagian terbaiknya adalah begitu aplikasi ditutup, kita tidak perlu khawatir tentang data yang disimpan. :)

Atul O Holic
sumber