以共享首选项存储和检索类对象

在Android中,我们可以将共享首选项中的类的对象存储起来,然后再检索对象?

如果有可能怎么做呢? 如果不可能的话,还有其他的可能性吗?

我知道序列化是一种select,但我正在寻找使用共享偏好的可能性。

不可能。

您只能在SharedPrefences SharePreferences.Editor中存储简单的值

你需要保存什么课程?

是的,我们可以使用Gson来做到这一点

从GitHub下载工作代码

SharedPreferences mPrefs = getPreferences(MODE_PRIVATE); 

保存

 Editor prefsEditor = mPrefs.edit(); Gson gson = new Gson(); String json = gson.toJson(myObject); // myObject - instance of MyObject prefsEditor.putString("MyObject", json); prefsEditor.commit(); 

得到

 Gson gson = new Gson(); String json = mPrefs.getString("MyObject", ""); MyObject obj = gson.fromJson(json, MyObject.class); 

UPDATE1

GSON的最新版本可以从github.com/google/gson下载。

UPDATE2

如果您正在使用Gradle / Android Studio,只需在build.gradle依赖项部分放入以下内容 –

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

我们可以使用Outputstream将我们的Object输出到内部存储器。 并转换为string,然后优先保存。 例如:

  mPrefs = getPreferences(MODE_PRIVATE); SharedPreferences.Editor ed = mPrefs.edit(); ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutput; try { objectOutput = new ObjectOutputStream(arrayOutputStream); objectOutput.writeObject(object); byte[] data = arrayOutputStream.toByteArray(); objectOutput.close(); arrayOutputStream.close(); ByteArrayOutputStream out = new ByteArrayOutputStream(); Base64OutputStream b64 = new Base64OutputStream(out, Base64.DEFAULT); b64.write(data); b64.close(); out.close(); ed.putString(key, new String(out.toByteArray())); ed.commit(); } catch (IOException e) { e.printStackTrace(); } 

当我们需要从首选项中提取对象。 使用下面的代码

  byte[] bytes = mPrefs.getString(indexName, "{}").getBytes(); if (bytes.length == 0) { return null; } ByteArrayInputStream byteArray = new ByteArrayInputStream(bytes); Base64InputStream base64InputStream = new Base64InputStream(byteArray, Base64.DEFAULT); ObjectInputStream in; in = new ObjectInputStream(base64InputStream); MyObject myObject = (MyObject) in.readObject(); 

我有同样的问题,这是我的解决scheme:

我有类MyClass和ArrayList <MyClass>,我想保存到共享首选项。 起初,我向MyClass添加了一个方法,将其转换为JSON对象:

 public JSONObject getJSONObject() { JSONObject obj = new JSONObject(); try { obj.put("id", this.id); obj.put("name", this.name); } catch (JSONException e) { e.printStackTrace(); } return obj; } 

那么这里是保存对象“ArrayList <MyClass>项目”的方法:

 SharedPreferences mPrefs = context.getSharedPreferences("some_name", 0); SharedPreferences.Editor editor = mPrefs.edit(); Set<String> set= new HashSet<String>(); for (int i = 0; i < items.size(); i++) { set.add(items.get(i).getJSONObject().toString()); } editor.putStringSet("some_name", set); editor.commit(); 

这里是检索对象的方法:

 public static ArrayList<MyClass> loadFromStorage() { SharedPreferences mPrefs = context.getSharedPreferences("some_name", 0); ArrayList<MyClass> items = new ArrayList<MyClass>(); Set<String> set = mPrefs.getStringSet("some_name", null); if (set != null) { for (String s : set) { try { JSONObject jsonObject = new JSONObject(s); Long id = jsonObject.getLong("id")); String name = jsonObject.getString("name"); MyClass myclass = new MyClass(id, name); items.add(myclass); } catch (JSONException e) { e.printStackTrace(); } } return items; } 

请注意,共享首选项中的StringSet从API 11开始可用。

使用Gson:

商店:

 Gson gson = new Gson; //Your json response object value store in json object JSONObject jsonObject = response.getJSONObject(); //Convert json object to string String json = gson.toJson(jsonObject); //Store in the sharedpreference getPrefs().setUserJson(json); 

检索:

 String json = getPrefs().getUserJson(); 

即使在应用程序closuresdonw之后或者在运行之后,是否还需要检索对象?

您可以将其存储到数据库中。
或者简单地创build一个自定义应用程序类

 public class MyApplication extends Application { private static Object mMyObject; // static getter & setter ... } <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application ... android:name=".MyApplication"> <activity ... /> ... </application> ... </manifest> 

然后从每一个活动做到:

 ((MyApplication) getApplication).getMyObject(); 

不是最好的方法,但它的工作原理。

使用这个对象 – > TinyDB – Android-Shared-Preferences-Turbo非常简单。 你可以像数组,整数,string列表等一样保存大部分常用对象

您可以使用复杂首选项Android – 通过Felipe Silvestre库来存储您的自定义对象。 基本上,它使用GSON机制来存储对象。

要将对象保存到prefs中:

 User user = new User(); user.setName("Felipe"); user.setAge(22); user.setActive(true); ComplexPreferences complexPreferences = ComplexPreferences.getComplexPreferences( this, "mypref", MODE_PRIVATE); complexPreferences.putObject("user", user); complexPreferences.commit(); 

并找回它:

 ComplexPreferences complexPreferences = ComplexPreferences.getComplexPreferences(this, "mypref", MODE_PRIVATE); User user = complexPreferences.getObject("user", User.class); 

没有办法在SharedPreferences中存储对象,我做的是创build一个公共类,把我需要的所有参数,创buildsetters和getters,我能够访问我的对象,

是的。您可以使用Sharedpreference存储和检索对象