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

时间:2011-03-24 11:06:58

标签: android object sharedpreferences

在Android中,我们可以在共享首选项中存储类的对象并稍后检索该对象吗?

如果有可能怎么办?如果不可能做到这一点的其他可能性是什么?

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

13 个答案:

答案 0 :(得分:310)

是的,我们可以使用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

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

UPDATE2

如果您正在使用Gradle / Android Studio,请在build.gradle依赖项部分 -

中添加以下内容
compile 'com.google.code.gson:gson:2.6.2'

答案 1 :(得分:44)

我们可以使用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();
    }

当我们需要从Preference中提取Object时。使用以下代码

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

答案 2 :(得分:15)

不可能。

您只能在SharedPreferences SharePreferences.Editor

中存储简单值

你需要保存什么特别的课程?

答案 3 :(得分:8)

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

我有类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> 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;
}

请注意,自API 11以来,共享首选项中的StringSet可用。

答案 4 :(得分:7)

使用Gson Library:

hide: {
    event: "asdf" //garbage event to allow hiding on close button click only
},

商品

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

答案 5 :(得分:1)

您可以使用GSON,使用Gradle Build.gradle:

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

然后在你的代码中,例如使用Kotlin的字符串/ boolean对:

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

答案 6 :(得分:1)

您可以通过3个简单的步骤使用PowerPreference库来做到这一点!

https://github.com/AliAsadi/PowerPreference

1。创建对象

Object obj = new Object();

2。写共享首选项

PowerPreference.getDefaultFile().put("object",obj);

3。获取对象

Object obj = PowerPreference.getDefaultFile()
                            .getObject("object", Object.class);

答案 7 :(得分:0)

使用此对象 - &gt; TinyDB--Android-Shared-Preferences-Turbo非常简单。 你可以保存大多数常用的对象,如数组,整数,字符串列表等

答案 8 :(得分:0)

您可以使用Complex Preferences Android - by 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);

答案 9 :(得分:0)

通用共享首选项(CURD) SharedPreference:使用简单的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

答案 10 :(得分:-1)

即使应用程序关闭donw或者只是在运行期间,您是否需要检索对象?

您可以将其存储到数据库中 或者只需创建一个自定义的应用程序类。

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

不是最好的方式,但它有效。

答案 11 :(得分:-1)

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

答案 12 :(得分:-5)

是。您可以使用共享偏好

存储和检索对象