将arraylist保存到SharedReferences

camsedfj  于 2021-07-12  发布在  Java
关注(0)|答案(30)|浏览(591)

我有一个 ArrayList 使用自定义对象。每个自定义对象都包含各种字符串和数字。我需要数组来保持,即使用户离开了活动,然后希望稍后再回来,但是我不需要在应用程序完全关闭后可用的数组。通过使用 SharedPreferences 但我不知道如何用这种方式保存整个数组。这可能吗?也许 吧 SharedPreferences 这样不好吗?有更简单的方法吗?

z9zf31ra

z9zf31ra16#

您可以使用gson库保存字符串和自定义数组列表。
=>首先需要创建函数将数组列表保存到SharedReferences。

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 !!!

    }

=>您需要创建函数从SharedReferences获取数组列表。

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'

fzwojiic

fzwojiic17#

我已经阅读了以上所有的答案。这都是正确的,但我发现了一个更简单的解决办法如下:
正在共享首选项中保存字符串列表>>

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

}
以及从共享首选项获取字符串列表>>

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 要打开的文件的名称;不能包含路径分隔符。

f2uvfpb9

f2uvfpb918#

最好的方法是使用gson转换为json字符串并将该字符串保存到sharedpreference。我也用这种方法来缓存响应。

z31licg0

z31licg019#

对于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

inb24sb2

inb24sb220#

还有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() }) 
}
txu3uszq

txu3uszq21#

您还可以将arraylist转换为字符串并将其保存在首选项中

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

将arraylist转换为字符串后,可以使用 convertToString 方法检索字符串并使用将其转换为数组 convertToArray api 11之后,您可以直接将存储集保存到SharedReferences!!!:)

fdbelqdn

fdbelqdn22#

这是你的完美解决方案。。试试看,

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

pb3skfrl23#

android sharedpreferans允许您将基本类型(boolean、float、int、long、string和stringset)作为xml文件保存在内存中。
任何解决方案的关键思想都是将数据转换为这些基本类型之一。
我个人喜欢将mylist转换成json格式,然后将其保存为sharedpreferences值中的字符串。
为了使用我的解决方案,你必须添加googlegson库。
在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());
1szpjjfi

1szpjjfi24#

嘿,朋友们,我没有使用 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.将值存储到SharedReference,使用 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.SharedReference的检索值使用 retriveSharedValue() :

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

我希望它能对你有所帮助。。。

xhv8bpkk

xhv8bpkk25#

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

java 语:

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

xmq68pz926#

正如@nirav所说,最好的解决方案是使用gson实用类将其作为json文本存储在sharedpreferences中。以下示例代码:

//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>(data);
String jsonText = gson.toJson(textList);
prefsEditor.putString("key", jsonText);
prefsEditor.apply();
qaxu7uf2

qaxu7uf227#

api 11之后 SharedPreferences Editor 接受 Sets . 你可以把你的列表转换成 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 然后从共享的参考资料中读取。
因为api只支持在SharedReferences之间存储和检索字符串(在api 11之后,就更简单了),所以我们必须序列化和反序列化arraylist对象,该对象包含一个字符串中的任务列表。
addTask() 方法,我们必须获取共享首选项的示例,然后使用 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();
  }
}

你可以得到 ObjectSerializer 来自apache pig项目objectserializer.java的类

e5nqia27

e5nqia2728#

你可以把它转换成 JSON String 并将字符串存储在 SharedPreferences .

0sgqnhkj

0sgqnhkj29#

正在保存 ArraySharedPreferences :

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

}

mrphzbgm

mrphzbgm30#

使用这个对象-->tinydb--android共享首选项非常简单。

TinyDB tinydb = new TinyDB(context);

使

tinydb.putList("MyUsers", mUsersArray);

得到

tinydb.getList("MyUsers");

更新
这里可以找到一些有用的例子和故障排除:android共享首选项tinydb putlistobject frunction

相关问题