साझा प्राथमिकता में एक वर्ग वस्तु को स्टोर और पुनः प्राप्त करना


111

एंड्रॉइड में हम साझा वरीयता में एक वर्ग के ऑब्जेक्ट को स्टोर कर सकते हैं और बाद में ऑब्जेक्ट को पुनः प्राप्त कर सकते हैं?

यदि यह संभव है तो यह कैसे करना है? यदि यह संभव नहीं है तो इसे करने की अन्य संभावनाएं क्या हैं?

मुझे पता है कि क्रमांकन एक विकल्प है, लेकिन मैं साझा प्राथमिकता का उपयोग करके संभावनाओं की तलाश कर रहा हूं।


यदि किसी को इसकी आवश्यकता हो तो मैं एक सहायक पुस्तकालय जोड़ता हूं: github.com/ionull/objectify
Tsung Goh

यहाँ एक उदाहरण thegeekyland.blogspot.com/2015/11/…
Arlind

यहां इसी तरह के सवाल का जवाब दिया गया है।
tpk


आप इस लाइब्रेरी का उपयोग कर सकते हैं जिसमें बहुत सारे फ़ोब्र्स इनबिल्ट हैं। github.com/moinkhan-in/PreferenceSpider
मोइनखान

जवाबों:


15

संभव नहीं।

आप केवल SharedPrefences में स्टोर कर सकते हैं, सरल मूल्यों SharePreferences.Editor

विशेष रूप से उस वर्ग के बारे में जिसे आपको बचाने की आवश्यकता है?


1
धन्यवाद। मैं वर्ग के कुछ डेटा सदस्यों को संग्रहीत करना चाहता हूं। और मैं साझा प्राथमिकता का उपयोग करके डेटा सदस्यों के प्रत्येक मूल्यों को संग्रहीत नहीं करना चाहता हूं। मैं इसे ऑब्जेक्ट के रूप में संग्रहीत करना चाहता हूं। यदि साझा प्राथमिकता नहीं है तो मेरे अन्य विकल्प क्या हैं?
androidGuy

5
इसे एक डेटाबेस (SQLite) / एक सपाट फ़ाइल में क्रमबद्ध करें और संग्रहीत करें।
ब्लंडेल

5
उत्तर पूर्ण नहीं है। संभव उपाय यह है कि पूजो को बाइटएयरएयरऑउटपुतस्ट्रीम में बदल दिया जाए और स्ट्रिंग को शेयर्डप्रिफरेंस में सहेजा जाए
रैलट

27
एक अन्य विकल्प इसे जसन के रूप में सहेजा गया है और फिर इसे वापस मैप करें। जीएसओएन या जैकसन के साथ वास्तव में आसान है
रैलट

2
मुझे मेरी टाइम मशीन 2011 तक वापस लाने और यह पता लगाने की जरूरत है कि
ब्लंडेल

324

हाँ हम 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

यदि आप ग्रेडल / एंड्रॉइड स्टूडियो का उपयोग कर रहे हैं, तो build.gradleनिर्भरता अनुभाग में निम्नलिखित डालें -

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

मेरे मामले में काम नहीं कर रहा। लिबरों में जार डालने और बिल्ड पाथ में सेट करने के बाद भी, Gson वर्ग हल नहीं हो रहा है।
शिरीष हेरवाडे

स्वच्छ परियोजना तो @ShirishHerwade का प्रयास करें
पराग चौहान

@ कपट भी काम नहीं कर रहा है। क्या आप उपरोक्त त्रुटि को दूर करने के लिए कृपया मुझे उस जार का उपयोग करने के चरण बता सकते हैं। क्योंकि मैंने लिबर्स फोल्डर में उस जार को सफलतापूर्वक जोड़ा और फिर "जावा बिल्ड पाथ" में भी अपने डेस्कटॉप पर बाहरी रूप से स्टोर किए गए
जोंस

7
यह उत्तर और भी बेहतर होगा यदि इसमें इसकी सीमाओं का भी उल्लेख हो। किस तरह की वस्तु हम इस तरीके से स्टोर और पुनर्प्राप्त नहीं कर सकते हैं? जाहिर है कि यह सभी वर्गों के लिए काम नहीं करेगा।
wvdz

3
String json = gson.toJson("MyObject");वस्तु एक स्ट्रिंग नहीं होनी चाहिए।
अहमद हेगाज़ी

44

हम अपने ऑब्जेक्ट को आंतरिक मेमोरी में आउटपुट करने के लिए आउटपुटस्ट्रीम का उपयोग कर सकते हैं। और स्ट्रिंग में कनवर्ट करें फिर वरीयता में सहेजें। उदाहरण के लिए:

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

नमस्ते, मुझे पता है कि यह थोड़ी देर पहले पोस्ट किया गया था, लेकिन क्या आप सुनिश्चित हैं कि आपके पास संग्रहीत ऑब्जेक्ट निकालने के लिए आपके पास कोड सही है? मुझे अंतिम 2 लाइनों पर कई त्रुटियां हो रही हैं, जिनके बारे में स्पष्ट रूप से बताया गया है कि स्पष्ट रूप से निर्माण करने वालों को "नई ObjectInputStream (बाइटएयरे)" के बजाय केवल परिभाषित करने की आवश्यकता है। सहायता के लिए धन्यवाद!
वाका वाका वाका

नमस्ते, मैं अचानक पर एक EOFException = new ObjectInputStream (base64InputStream) प्राप्त कर रहा हूं; मैं इसे उसी तरह साझा किए गए Prefs में लिख रहा हूं जैसे आप कर रहे हैं। आपको क्या लगता है कि गलत हो सकता है?
मारिएनके

जब आप ऑब्जेक्ट को प्रीफ़ लिखते हैं तो क्या आपके पास कोई अपवाद है? SDK से: किसी प्रोग्राम के इनपुट के दौरान किसी प्रोग्राम या स्ट्रीम के अंत का सामना करने पर EOFException को फेंक दें।
किसिंगकांड

कुदोस, यह इस समस्या के लिए अब तक का सबसे अच्छा समाधान है। कोई निर्भरता नहीं। हालाँकि, यह ध्यान दिया जाना चाहिए कि किसी ऑब्जेक्ट के लिए ObjectOutput / InputStream का उपयोग करने में सक्षम होने के लिए, उक्त ऑब्जेक्ट और उसके भीतर की सभी कस्टम ऑब्जेक्ट Serializable इंटरफ़ेस को लागू करना चाहिए।
user1112789

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

ध्यान दें कि साझा प्राथमिकता में StringSet API 11 के बाद से उपलब्ध है।


मेरी समस्या का समाधान किया। मैं कुछ जोड़ना चाहता हूं। पहले उपयोग के लिए हमें यह देखना होगा कि सेट शून्य है या नहीं। if (सेट! = null) {for (स्ट्रिंग s: सेट) {..}}
xevser

@xevser मैंने सुझाव के रूप में शून्य चेक जोड़ा है। धन्यवाद।
माइकर

6

Gson लाइब्रेरी का उपयोग करना:

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

पार्सल एक सामान्य-प्रयोजन क्रमिक तंत्र नहीं है। इस वर्ग (और पार्सल में मनमानी वस्तुओं को रखने के लिए इसी पार्सलेबल एपीआई) को उच्च प्रदर्शन वाले आईपीसी परिवहन के रूप में तैयार किया गया है। जैसे, किसी भी पार्सल डेटा को लगातार स्टोरेज में रखना उचित नहीं है: पार्सल में किसी भी डेटा के अंतर्निहित कार्यान्वयन में परिवर्तन पुराने डेटा को अपठनीय बना सकता है।
मार्कोस वास्कोनसेलोस 18

1

आप इसका उपयोग कर सकते हैं PowerPreference 3 आसान चरणों में पुस्तकालय !

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

0

इस ऑब्जेक्ट का उपयोग करना -> टिनीबीडी - एंड्रॉइड-साझा-प्राथमिकताएं-टर्बो इसकी बहुत सरल है। आप इसके साथ आमतौर पर इस्तेमाल की जाने वाली अधिकांश वस्तुओं को सहेज सकते हैं जैसे कि सरणियाँ, पूर्णांक, तार सूची आदि


कूल, लेकिन मुझे लगता है कि यह सिर्फ प्राइमिटी प्रकारों के लिए काम करता है (स्ट्रिंग, डबल, इंट, आदि) कस्टम ऑब्जेक्ट्स के लिए नहीं (POJOS)
CommonSenseCode

यह अब कस्टम ऑब्जेक्ट्स के लिए काम करता है,
ReadMe की

0

आप उपयोग कर सकते हैं अपने कस्टम ऑब्जेक्ट्स को स्टोर करने के लिए फेलिप सिल्वेस्ट्रे लाइब्रेरी द्वारा कॉम्प्लेक्स प्रेफरेंस एंड्रॉइड का । असल में, यह वस्तुओं को संग्रहीत करने के लिए GSON तंत्र का उपयोग कर रहा है।

ऑब्जेक्ट को प्रीफ़ में सहेजने के लिए:

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

पार्सल एक सामान्य-प्रयोजन क्रमिक तंत्र नहीं है। इस वर्ग (और पार्सल में मनमानी वस्तुओं को रखने के लिए इसी पार्सलेबल एपीआई) को उच्च प्रदर्शन वाले आईपीसी परिवहन के रूप में तैयार किया गया है। जैसे, किसी भी पार्सल डेटा को लगातार स्टोरेज में रखना उचित नहीं है: पार्सल में किसी भी डेटा के अंतर्निहित कार्यान्वयन में परिवर्तन पुराने डेटा को अपठनीय बना सकता है।
मार्कोस वास्कोनसेलोस

यह पदावनत है
इगोरगानापोलस्की

0

आप ग्रेड बिल्ड का उपयोग करके GSON का उपयोग कर सकते हैं।

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

फिर आपके कोड में, उदाहरण के लिए कोटलिन के साथ स्ट्रिंग / बूलियन के जोड़े:

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

पार्सल एक सामान्य-प्रयोजन क्रमिक तंत्र नहीं है। इस वर्ग (और पार्सल में मनमानी वस्तुओं को रखने के लिए इसी पार्सलेबल एपीआई) को उच्च प्रदर्शन वाले आईपीसी परिवहन के रूप में तैयार किया गया है। जैसे, किसी भी पार्सल डेटा को लगातार स्टोरेज में रखना उचित नहीं है: पार्सल में किसी भी डेटा के अंतर्निहित कार्यान्वयन में परिवर्तन पुराने डेटा को अपठनीय बना सकता है।
मार्कोस वास्कोनसेलोस

0

साझा साझा प्राथमिकता (CURD) साझाकरण: एक साधारण कोटलिन वर्ग के साथ मूल्य-कुंजी जोड़े के रूप में डेटा संग्रहीत करना।

var sp = SharedPreference(this);

आकड़ो का भंडारण किया जा रहा हैं:

स्ट्रिंग, इंट और बुलियन डेटा को स्टोर करने के लिए हमारे पास एक ही नाम और अलग-अलग मापदंडों के तीन तरीके हैं (मेथड ओवरलोडिंग)।

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

डेटा प्राप्त करें: साझा किए गए डेटा में संग्रहीत डेटा को पुनः प्राप्त करने के लिए निम्नलिखित विधियों का उपयोग करें।

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

सभी डेटा को साफ़ करें: संपूर्ण साझाकरण को साफ़ करने के लिए नीचे दिए गए कोड का उपयोग करें।

 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/sared-preference.html


-2

SharedPreferences में वस्तुओं को संग्रहीत करने का कोई तरीका नहीं है, मैंने जो किया वह एक सार्वजनिक वर्ग बनाने के लिए है, मुझे जिन सभी मापदंडों की आवश्यकता है उन्हें निर्धारित करें और बसने और पाने वाले बनाएं, मैं अपनी वस्तुओं तक पहुंचने में सक्षम था,


-3

क्या आपको एप्लिकेशन शटडाउन करने के बाद भी ऑब्जेक्ट को पुनः प्राप्त करने की आवश्यकता है या बस चलने के दौरान?

आप इसे डेटाबेस में स्टोर कर सकते हैं।
या बस एक कस्टम अनुप्रयोग वर्ग बनाएँ।

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

वास्तव में सबसे अच्छा तरीका नहीं है लेकिन यह काम करता है।


-6

हाँ। आप साझाकरण का उपयोग करके ऑब्जेक्ट को संग्रहीत और पुनः प्राप्त कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.