自定义对象的Android ArrayList-保存到SharedPreferences-可序列化吗?


78

我有一个对象的ArrayList。该对象包含“位图”和“字符串”类型,然后分别包含这两种类型的获取器和设置器。首先,位图可序列化吗?

我将如何对其进行序列化以将其存储在SharedPreferences中?我已经看到很多人都提出了类似的问题,但似乎没有一个很好的答案。如果可能的话,我希望有一些代码示例。

如果位图不可序列化,那么如何存储此ArrayList?

非常感谢。


SharedPreferences的缺点是您无法在其中存储对象,因此无法存储对象:(
Abhinav Singh Maurya 2013年

要序列化它,可以使用此答案。但我不知道这对您有什么帮助SharedPreferences,因为您不能仅在其中存储序列化的对象。也许您正在考虑Bundle
Geobits,

1
是的,您可以保存。检查我的答案。
Mohammad Imran

Answers:


147

是的,您可以将复合对象保存在共享的首选项中。比方说

 Student mStudentObject = new Student();
 SharedPreferences appSharedPrefs = PreferenceManager
             .getDefaultSharedPreferences(this.getApplicationContext());
 Editor prefsEditor = appSharedPrefs.edit();
 Gson gson = new Gson();
 String json = gson.toJson(mStudentObject);
 prefsEditor.putString("MyObject", json);
 prefsEditor.commit(); 

..现在您可以按以下方式检索对象:

 SharedPreferences appSharedPrefs = PreferenceManager
             .getDefaultSharedPreferences(this.getApplicationContext());
 Gson gson = new Gson();
 String json = appSharedPrefs.getString("MyObject", "");
 Student mStudentObject = gson.fromJson(json, Student.class);

有关更多信息,请单击此处。

如果您想找回ArrayList任何类型的对象,例如Student,请使用:

Type type = new TypeToken<List<Student>>(){}.getType();
List<Student> students = gson.fromJson(json, type);

将JSON数组名称存储到首选项时如何放置?
Noman 2013年

你什么意思?请详细说明您的问题。
Mohammad Imran

如果要保存数组
列表,

12
@Bhavik Metha,以上编写的代码不适用于Arraylist,以上代码仅是示例。如果要获取任何对象的数组列表,请使用:Type type = new TypeToken <List <Student >>(){}。getType();。List <Student> students = gson.fromJson(json,type);
Mohammad Imran

1
很好的主意。太棒了 谢谢。
VipPunkJoshers Droopy

121

上面的答案有效,但不适用于列表:

要保存对象列表,请执行以下操作:

List<Cars> cars= new ArrayList<Cars>();
    cars.add(a);
    cars.add(b);
    cars.add(c);
    cars.add(d);

    gson = new Gson();
    String jsonCars = gson.toJson(cars);
    Log.d("TAG","jsonCars = " + jsonCars);

阅读json对象:

Type type = new TypeToken<List<Cars>>(){}.getType();
List<Cars> carsList = gson.fromJson(jsonCars, type);

3
Type这里的包是什么?
2014年

9
导入java.lang.reflect.Type;
SpyZip

如果使用通配符,该怎么办: Type type = new TypeToken<List<?>>(){}.getType(); 结果是我得到一个LinkedTreeMap,这是我的方法的定义: public static List<?> getList(String json) {
f.trajkovski

23

对我来说,它像这样工作:

将值放在SharedPreferances中:

String key = "Key";
ArrayList<ModelClass> ModelArrayList=new ArrayList();

SharedPreferences shref;
SharedPreferences.Editor editor;
shref = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

Gson gson = new Gson();
String json = gson.toJson(ModelArrayList);

editor = shref.edit();
editor.remove(key).commit();
editor.putString(key, json);
editor.commit();

要从SharedPreferances获取值:

Gson gson = new Gson();
String response=shref.getString(key , "");
ArrayList<ModelClass> lstArrayList = gson.fromJson(response, 
    new TypeToken<List<ModelClass>>(){}.getType());

15

对于保存:

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

对于负载:

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

PhoneCallLog是我的自定义对象的名称。(包含字符串,长整数和布尔值)


1
我们不应该使用apply代替commit吗?
shiftking9987 '16

我们需要在哪里放置这些方法调用?
卢卡斯·索萨

2

上面的Mete'示例就像一个魅力。
这是科特林的例子

private var prefs: SharedPreferences = context?.getSharedPreferences("sharedPrefs", MODE_PRIVATE)
    ?: error("err")
private val gson = Gson()

fun saveObjectToArrayList(yourObject: YourObject) {
    val bookmarks = fetchArrayList()
    bookmarks.add(0, yourObject)
    val prefsEditor = prefs.edit()

    val json = gson.toJson(bookmarks)
    prefsEditor.putString("your_key", json)
    prefsEditor.apply()
}

fun fetchArrayList(): ArrayList<YourObject> {
    val yourArrayList: ArrayList<YourObject>
    val json = prefs.getString("your_key", "")

    yourArrayList = when {
        json.isNullOrEmpty() -> ArrayList()
        else -> gson.fromJson(json, object : TypeToken<List<Feed>>() {}.type)
    }

    return yourArrayList
}

1

的kotlin实现Gson,扩展了@SpyZips的答案,

序列化为JSON

val jsonCars: String = Gson().toJson(cars);

反序列化回到objs列表

val type = object: TypeToken<List<Car>>(){}.type
val carsList: List<Car> = Gson().fromJson(jsonCars, type)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.