store and retrieve a class object in shared preference

In Android can we store an object of a class in shared preference and retrieve the object later?

If it is possible how to do it? If it is not possible what are the other possibilities of doing it?

I know that serialization is one option, but I am looking for possibilities using shared preference.

112281 次浏览

不可能。

You can only store, simple values in SharedPrefences 编辑器

你需要保存的类有什么特别的地方吗?

即使在应用程序关闭之后或者只是在应用程序运行期间,您还需要检索该对象吗?

可以将其存储到数据库中。
或者简单地创建一个自定义 Application 类。

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

虽然不是最好的办法,但是很管用。

我们可以使用 Outputstream 将 Object 输出到内存中。然后转换为字符串,然后优先保存。例如:

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

when we need to extract Object from Preference. Use the code as below

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

是的,我们可以使用 葛森做到这一点

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

更新1

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

更新2

如果你正在使用 Gradle/Android Studio,只需在 abc0依赖关系部分-

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

I had the same problem, here's my solution:

我有类 MyClassArrayList<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> items的方法:

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开始就可用了。

使用这个对象—— > TinyDB —— Android-Shared-Preferences-Turbo非常简单。 你可以用它来保存大多数常用的对象,比如数组、整数、字符串列表等等

Using Gson Library:

dependencies {
compile 'com.google.code.gson:gson:2.8.2'
}

店铺:

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

可以。您可以使用 Sharedferences 存储和检索该对象

在 SharedPreferences 没有存储对象的方法我所做的就是创建一个公共类放入我需要的所有参数创建 setter 和 getter 我能够访问我的对象,

可以使用 复杂偏好 Android-by Felipe Silvestre 作者: Felipe Silvestre库存储自定义对象。 基本上,它使用 GSON 机制来存储对象。

将 object 保存为 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);

你可以使用 GSON,使用 Gradle Build.Gradle:

implementation 'com.google.code.gson:gson:2.8.0'

然后在您的代码中,例如与 Kotlin 对应的字符串/布尔值对:

        val nestedData = HashMap<String,Boolean>()
for (i in 0..29) {
nestedData.put(i.toString(), true)
}
val gson = Gson()
val jsonFromMap = gson.toJson(nestedData)

添加到 SharedPrefs:

        val sharedPrefEditor = context.getSharedPreferences(_prefName, Context.MODE_PRIVATE).edit()
sharedPrefEditor.putString("sig_types", jsonFromMap)
sharedPrefEditor.apply()

现在检索数据:

val gson = Gson()
val sharedPref: SharedPreferences = context.getSharedPreferences(_prefName, Context.MODE_PRIVATE)
val json = sharedPref.getString("sig_types", "false")
val type = object : TypeToken<Map<String, Boolean>>() {}.type
val map = gson.fromJson(json, type) as LinkedTreeMap<String,Boolean>
for (key in map.keys) {
Log.i("myvalues", key.toString() + map.get(key).toString())
}

公共共享首选项(CURD) SharedPreferences: 用一个简单的 Kotlin 类以值-键对的形式存储数据。

var sp = SharedPreference(this);

储存资料:

要存储 String、 Int 和 Boolean 数据,我们有三个具有相同名称和不同参数的方法(方法重载)。

save("key-name1","string value")
save("key-name2",int value)
save("key-name3",boolean)

检索数据: 若要检索存储在 SharedPreferences 中的数据,请使用以下方法。

sp.getValueString("user_name")
sp.getValueInt("user_id")
sp.getValueBoolean("user_session",true)

清除所有资料: 要清除整个 SharedPreferences,请使用下面的代码。

 sp.clearSharedPreference()

删除特定数据:

sp.removeValue("user_name")

共享首选项类

import android.content.Context
import android.content.SharedPreferences


class SharedPreference(private val context: Context) {
private val PREFS_NAME = "coredata"
private val sharedPref: SharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
//********************************************************************************************** save all
//To Store String data
fun save(KEY_NAME: String, text: String) {


val editor: SharedPreferences.Editor = sharedPref.edit()
editor.putString(KEY_NAME, text)
editor.apply()
}
//..............................................................................................
//To Store Int data
fun save(KEY_NAME: String, value: Int) {


val editor: SharedPreferences.Editor = sharedPref.edit()
editor.putInt(KEY_NAME, value)
editor.apply()
}
//..............................................................................................
//To Store Boolean data
fun save(KEY_NAME: String, status: Boolean) {


val editor: SharedPreferences.Editor = sharedPref.edit()
editor.putBoolean(KEY_NAME, status)
editor.apply()
}
//********************************************************************************************** retrieve selected
//To Retrieve String
fun getValueString(KEY_NAME: String): String? {


return sharedPref.getString(KEY_NAME, "")
}
//..............................................................................................
//To Retrieve Int
fun getValueInt(KEY_NAME: String): Int {


return sharedPref.getInt(KEY_NAME, 0)
}
//..............................................................................................
// To Retrieve Boolean
fun getValueBoolean(KEY_NAME: String, defaultValue: Boolean): Boolean {


return sharedPref.getBoolean(KEY_NAME, defaultValue)
}
//********************************************************************************************** delete all
// To clear all data
fun clearSharedPreference() {


val editor: SharedPreferences.Editor = sharedPref.edit()
editor.clear()
editor.apply()
}
//********************************************************************************************** delete selected
// To remove a specific data
fun removeValue(KEY_NAME: String) {
val editor: SharedPreferences.Editor = sharedPref.edit()
editor.remove(KEY_NAME)
editor.apply()
}
}

博客: Https://androidkeynotes.blogspot.com/2020/02/shared-preference.html