क्या Android पर किसी साझा या ऑब्जेक्ट के लिए कोई सरणी या ऑब्जेक्ट जोड़ना संभव है


83

मेरे पास एक ArrayListऑब्जेक्ट है जिसका एक नाम और एक आइकन पॉइंटर है और मैं इसे सहेजना चाहता हूं SharedPreferences। मैं कैसे कर सकता हूँ?

नोट: मैं डेटाबेस का उपयोग नहीं करना चाहता

जवाबों:


60

तो डेटा संग्रहण पर Android डेवलपर साइट से :

उपयोगकर्ता वरीयताएं

साझा प्राथमिकताएं "उपयोगकर्ता वरीयताओं" को बचाने के लिए कड़ाई से नहीं हैं, जैसे कि उपयोगकर्ता ने किस रिंगटोन को चुना है। यदि आप अपने एप्लिकेशन के लिए उपयोगकर्ता प्राथमिकताएं बनाने में रुचि रखते हैं, तो प्राथमिकता देखें, जो आपको उपयोगकर्ता प्राथमिकताएं बनाने के लिए एक गतिविधि ढांचा प्रदान करता है, जो स्वचालित रूप से जारी रहेगा (साझा प्राथमिकताओं का उपयोग करके)।

इसलिए मुझे लगता है कि यह ठीक है क्योंकि यह केवल कुंजी-मूल्य वाले जोड़े हैं जो कि कायम हैं।

मूल पोस्टर के लिए, यह उतना मुश्किल नहीं है। आप बस अपनी सरणी सूची के माध्यम से पुनरावृत्त करें और आइटम जोड़ें। इस उदाहरण में मैं सरलता के लिए एक मानचित्र का उपयोग करता हूं लेकिन आप एक सरणी सूची का उपयोग कर सकते हैं और इसे उचित रूप से बदल सकते हैं:

// my list of names, icon locations
Map<String, String> nameIcons = new HashMap<String, String>();
nameIcons.put("Noel", "/location/to/noel/icon.png");
nameIcons.put("Bob", "another/location/to/bob/icon.png");
nameIcons.put("another name", "last/location/icon.png");

SharedPreferences keyValues = getContext().getSharedPreferences("name_icons_list", Context.MODE_PRIVATE);
SharedPreferences.Editor keyValuesEditor = keyValues.edit();

for (String s : nameIcons.keySet()) {
    // use the name as the key, and the icon as the value
    keyValuesEditor.putString(s, nameIcons.get(s));
}
keyValuesEditor.commit()

आप फिर से कुंजी-मूल्य जोड़े को पढ़ने के लिए कुछ ऐसा ही करेंगे। अगर यह कार्यशील है, तो मुझे बताएं।

अद्यतन: यदि आप एपीआई स्तर 11 या उसके बाद का उपयोग कर रहे हैं, तो एक स्ट्रिंग सेट लिखने की विधि है


धन्यवाद नोएल, मैंने इसे आपके कोड की मदद से समझ लिया। हालांकि कोड टाइपो देखें। ;)
zsniperx

एक आकर्षण की तरह काम किया ... Thx
बाला विष्णु

74

एपीआई स्तर की परवाह किए बिना, साझाकरण सरणियों और ऑब्जेक्ट सरणियों की जाँच करें


बचना ARRAY

public boolean saveArray(String[] array, String arrayName, Context mContext) {   
    SharedPreferences prefs = mContext.getSharedPreferences("preferencename", 0);  
    SharedPreferences.Editor editor = prefs.edit();  
    editor.putInt(arrayName +"_size", array.length);  
    for(int i=0;i<array.length;i++)  
        editor.putString(arrayName + "_" + i, array[i]);  
    return editor.commit();  
} 

लोड ARRAY

public String[] loadArray(String arrayName, Context mContext) {  
    SharedPreferences prefs = mContext.getSharedPreferences("preferencename", 0);  
    int size = prefs.getInt(arrayName + "_size", 0);  
    String array[] = new String[size];  
    for(int i=0;i<size;i++)  
        array[i] = prefs.getString(arrayName + "_" + i, null);  
    return array;  
}  

10
यह एक भयानक तकनीक है। उस ब्लॉग पर टिप्पणियों को देखें : "इस दृष्टिकोण के साथ समस्या यह है कि आप अपनी वरीयताओं को प्रदूषित करेंगे। कहते हैं, आप 100 प्रविष्टियों के साथ एक सरणी को सहेजते हैं और फिर इसे 2 से हटते हैं। आपकी वरीयताओं में अभी भी 100 प्रविष्टियाँ होंगी जब तक आप पहले इसे साफ करो। "
काइल आइवे

2
सफाई एक आसान जोड़ नहीं है
शेरिफ एलकिताब

धन्यवाद, बहुत अच्छा स्टाइल कोड। यह SO पर यहाँ मेरे पसंदीदा उत्तरों में से एक है। :)
मार्टिन फ़ेफ़र

3
यह एक गलत तरीका है !!! आप 100 चर जोड़ने की कोशिश करते हैं, और यह भयानक है !! इसके बजाय आप jsonarray और jsonbj के साथ इस विधि का उपयोग कर सकते हैं: stackoverflow.com/a/8287418/2652368
अमीर होसैन

@AmirHosseinGhasemi दोनों दृष्टिकोण वास्तव में हैक हैं। धन्यवाद
शरीफ elKhatib

60

लिखना,

SharedPreferences prefs = PreferenceManager
        .getDefaultSharedPreferences(this);
JSONArray jsonArray = new JSONArray();
jsonArray.put(1);
jsonArray.put(2);
Editor editor = prefs.edit();
editor.putString("key", jsonArray.toString());
System.out.println(jsonArray.toString());
editor.commit();

पढ़ने के लिए,

try {
    JSONArray jsonArray2 = new JSONArray(prefs.getString("key", "[]"));
    for (int i = 0; i < jsonArray2.length(); i++) {
         Log.d("your JSON Array", jsonArray2.getInt(i)+"");
    }
} catch (Exception e) {
    e.printStackTrace();
}

31

साझा प्राथमिकताएं शुरू की गईं getStringSetऔरputStringSet एपीआई स्तर 11 में तरीके , लेकिन यह एंड्रॉइड के पुराने संस्करणों (जो अभी भी लोकप्रिय हैं) के साथ संगत नहीं है, और यह भी स्ट्रिंग्स के सेट तक सीमित है।

एंड्रॉइड बेहतर तरीके प्रदान नहीं करता है, और उन्हें सहेजने और लोड करने के लिए नक्शे और सरणियों पर लूपिंग करना बहुत आसान और साफ नहीं है, विशेष रूप से सरणियों के लिए। लेकिन एक बेहतर क्रियान्वयन उतना कठिन नहीं है:

package com.example.utils;

import org.json.JSONObject;
import org.json.JSONArray;
import org.json.JSONException;

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

public class JSONSharedPreferences {
    private static final String PREFIX = "json";

    public static void saveJSONObject(Context c, String prefName, String key, JSONObject object) {
        SharedPreferences settings = c.getSharedPreferences(prefName, 0);
        SharedPreferences.Editor editor = settings.edit();
        editor.putString(JSONSharedPreferences.PREFIX+key, object.toString());
        editor.commit();
    }

    public static void saveJSONArray(Context c, String prefName, String key, JSONArray array) {
        SharedPreferences settings = c.getSharedPreferences(prefName, 0);
        SharedPreferences.Editor editor = settings.edit();
        editor.putString(JSONSharedPreferences.PREFIX+key, array.toString());
        editor.commit();
    }

    public static JSONObject loadJSONObject(Context c, String prefName, String key) throws JSONException {
        SharedPreferences settings = c.getSharedPreferences(prefName, 0);
        return new JSONObject(settings.getString(JSONSharedPreferences.PREFIX+key, "{}"));
    }

    public static JSONArray loadJSONArray(Context c, String prefName, String key) throws JSONException {
        SharedPreferences settings = c.getSharedPreferences(prefName, 0);
        return new JSONArray(settings.getString(JSONSharedPreferences.PREFIX+key, "[]"));
    }

    public static void remove(Context c, String prefName, String key) {
        SharedPreferences settings = c.getSharedPreferences(prefName, 0);
        if (settings.contains(JSONSharedPreferences.PREFIX+key)) {
            SharedPreferences.Editor editor = settings.edit();
            editor.remove(JSONSharedPreferences.PREFIX+key);
            editor.commit();
        }
    }
}

अब आप इस पांच विधियों के साथ साझा प्राथमिकताओं में किसी भी संग्रह को बचा सकते हैं। के साथ काम करना JSONObjectऔर JSONArrayबहुत आसान है। आप उपयोग कर सकते हैं JSONArray (Collection copyFrom)एक बनाने के लिए सार्वजनिक निर्माता JSONArrayकिसी भी जावा संग्रहण और उपयोग से बाहर JSONArrayके getतत्वों का उपयोग करने के तरीके।

साझा प्राथमिकताओं के लिए कोई आकार सीमा नहीं है (डिवाइस की संग्रहण सीमा के अलावा), इसलिए ये विधियाँ उन अधिकांश सामान्य मामलों के लिए काम कर सकती हैं, जहाँ आप अपने ऐप में कुछ संग्रह के लिए त्वरित और आसान भंडारण चाहते हैं। लेकिन JSON पार्सिंग यहां होता है, और एंड्रॉइड में प्राथमिकताएं आंतरिक रूप से XMLs के रूप में संग्रहीत की जाती हैं, इसलिए जब आप मेगाबाइट डेटा के साथ काम कर रहे होते हैं तो मैं अन्य लगातार डेटा स्टोर तंत्र का उपयोग करने की सलाह देता हूं।


7
यदि आप JSON के साथ जा रहे हैं, तो शायद gson देखें: code.google.com/p/google-gson - यह JSON ऑब्जेक्ट्स को JSON से और उससे कनवर्ट करता है।
फीचरक्रैप

यह एक दिलचस्प संयोजन होगा।
मोस्टफा

17

Gson google पुस्तकालय का उपयोग करने के साथ जटिल वस्तु भंडारण के लिए आसान तरीका [1]

public static void setComplexObject(Context ctx, ComplexObject obj){
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(ctx);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString("COMPLEX_OBJECT",new Gson().toJson(obj)); 
    editor.commit();
}

public static ComplexObject getComplexObject (Context ctx){
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(ctx);
    String sobj = preferences.getString("COMPLEX_OBJECT", "");
    if(sobj.equals(""))return null;
    else return new Gson().fromJson(sobj, ComplexObject.class);
}

[१] http://code.google.com/p/google-gson/


सबसे अच्छा! ANSWER के रूप में इसे चिह्नित करें!
रेनन फ्रैंका

3

मैंने अपनी वरीयताओं में कमर के आकार की एक सरणी (पहले से ही मेरे array.xml में बनाई गई) को नीचे दिए गए कोड के साथ लोड किया। @ सरणी / pant_inch_size पूरे सरणी की आईडी है।

 <ListPreference 
 android:title="choosepantsize"
 android:summary="Choose Pant Size"
 android:key="pantSizePref" 
 android:defaultValue="34" 
 android:entries="@array/pant_inch_size"
 android:entryValues="@array/pant_inch_size" /> 

यह सरणी से विकल्पों के साथ मेनू को आबाद करता है। मैंने डिफ़ॉल्ट आकार 34 के रूप में सेट किया है, इसलिए जब मेनू पॉप अप होता है, तो वे देखते हैं कि आकार 34 पूर्व-चयनित है।


हाय कीथ, आपकी प्रतिक्रिया के लिए धन्यवाद। मुझे एक ऑर्डर स्टोर करने की आवश्यकता है और मैं वरीयता ui के साथ काम नहीं करता हूं, इसलिए मुझे नहीं लगता कि आपके कोड को मेरे द्वारा पूरा करने की आवश्यकता है। धन्यवाद वैसे भी
zsniperx

आह !! मैंने आपके सवाल का गलत मतलब निकाला, इस बारे में खेद है। किसी भी अन्य पाठकों के लिए, मेरा एक्सएमएल कोड बस मेरे array.xml फ़ाइल से आइटम पकड़ लेता है और उन्हें प्राथमिकता मेनू में लोड करता है, इस वरीयता में "34" के रूप में डिफ़ॉल्ट प्राथमिकता पूर्व-चयनित है। मैं इस विशेष वरीयता के लिए पहचानकर्ता को खोजने के लिए जावा का उपयोग करता हूं, जो कि "पैनसाइज़ पीएआरएफ" ("कुंजी") है।
कीथ

2

सरल तरीका है, इसे नीचे दिए गए उदाहरण के रूप में JSON स्ट्रिंग में बदलना:

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

फिर साझा प्राथमिकताओं में स्ट्रिंग को संग्रहीत करें। एक बार जब आपको इसकी आवश्यकता होती है तो बस साझा प्राथमिकताओं से स्ट्रिंग प्राप्त करें और वापस JSONArray या JSONObject में परिवर्तित करें (अपनी आवश्यकता के अनुसार)।


2

लिखने हेतु:

 private <T> void storeData(String key, T data) {
    ByteArrayOutputStream serializedData = new ByteArrayOutputStream();

    try {
        ObjectOutputStream serializer = new ObjectOutputStream(serializedData);
        serializer.writeObject(data);
    } catch (IOException e) {
        e.printStackTrace();
    }

    SharedPreferences sharedPreferences = getSharedPreferences(TAG, 0);
    SharedPreferences.Editor edit = sharedPreferences.edit();

    edit.putString(key, Base64.encodeToString(serializedData.toByteArray(), Base64.DEFAULT));
    edit.commit();
}

पढ़ने के लिए:

private <T> T getStoredData(String key) {
    SharedPreferences sharedPreferences = getSharedPreferences(TAG, 0);
    String serializedData = sharedPreferences.getString(key, null);
    T storedData = null;
    try {
        ByteArrayInputStream input = new ByteArrayInputStream(Base64.decode(serializedData, Base64.DEFAULT));
        ObjectInputStream inputStream = new ObjectInputStream(input);
        storedData = (T)inputStream.readObject();
    } catch (IOException|ClassNotFoundException|java.lang.IllegalArgumentException e) {
        e.printStackTrace();
    }

    return storedData;
}

यह एक ध्वनि सुझाव जैसा लगता है। सामान्य संग्रह सभी सीरियल को लागू करने वाले होते हैं, और आपके मूल स्ट्रिंग, संख्या और दिनांक क्रमिक होते हैं। केवल नकारात्मक पहलू प्रदर्शन होगा।
androidguy

1

यह साझा प्राथमिकताएं कोड है जिसका मैं सफलतापूर्वक उपयोग करता हूं, इस लिंक को देखें :

  public class MainActivity extends Activity {

private static final int RESULT_SETTINGS = 1;
Button button;
public String a="dd";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

 button = (Button) findViewById(R.id.btnoptions);


setContentView(R.layout.activity_main);

  // showUserSettings();
  }

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.settings, menu);
return true;
 }

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {

case R.id.menu_settings:
 Intent i = new Intent(this, UserSettingActivity.class);
 startActivityForResult(i, RESULT_SETTINGS);
 break;

 }

return true;
}

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data)     {
  super.onActivityResult(requestCode, resultCode, data);

 switch (requestCode) {
 case RESULT_SETTINGS:
 showUserSettings();
 break;

 } 

  }

  private void showUserSettings() {
 SharedPreferences sharedPrefs = PreferenceManager
.getDefaultSharedPreferences(this);

 StringBuilder builder = new StringBuilder();

 builder.append("\n Pet: "
  + sharedPrefs.getString("prefpetname", "NULL"));

 builder.append("\n Address:"
 + sharedPrefs.getString("prefaddress","NULL" ));

 builder.append("\n Your name: "
 + sharedPrefs.getString("prefname", "NULL"));

 TextView settingsTextView = (TextView) findViewById(R.id.textUserSettings);


  settingsTextView.setText(builder.toString());


    }

   }

खुश कोडिंग!


0

आप उपयोग कर सकते हैं putStringSet का

यह आपको अपनी प्राथमिकताओं में हैशसेट को बचाने की अनुमति देता है, जैसे:

सहेजें

Set<String> values;

SharedPreferences sharedPref = 
    mContext.getSharedPreferences(PREF_KEY, Context.MODE_PRIVATE);

Editor editor = sharedPref.edit();

editor.putStringSet("YOUR_KEY", values);
editor.apply();

पुन: प्राप्त करें

SharedPreferences sharedPref = 
    mContext.getSharedPreferences(PREF_KEY, Context.MODE_PRIVATE);

Editor editor = sharedPref.edit();

Set<String> newList = editor.getStringSet("YOUR_KEY", null);

PutStringSet सिर्फ एक सेट की अनुमति है और यह एक है अव्यवस्थित सूची।


0

जब मुझे इस बात से इंकार किया गया, तो मुझे सीरियलिंग सॉल्यूशन मिला, जहां, आप अपनी स्ट्रिंग को सीरियस कर सकते हैं, लेकिन मैं एक हैक भी कर आया।

इसे केवल तभी पढ़ें जब आपने क्रमांकन के बारे में नहीं पढ़ा है, अन्यथा नीचे जाएं और मेरी हैक पढ़ें

क्रम में सरणी आइटम संग्रहीत करने के लिए, हम सरणी को एक स्ट्रिंग में क्रमबद्ध कर सकते हैं (एक नया वर्ग ObjectSerializer बनाकर (कोड की प्रतिलिपि बनाएं - www.androiddevcourse.com/objectserializer.html, पैकेज नाम को छोड़कर सब कुछ बदलें)

साझा प्राथमिकता में डेटा दर्ज करना: यहां छवि विवरण दर्ज करें

लाइन 38 पर बाकी कोड - यहां छवि विवरण दर्ज करें

अगला arg इस रूप में डालें, ताकि यदि डेटा पुनः प्राप्त नहीं होता है, तो यह खाली सरणी लौटाएगा (हम खिचड़ी भाषा में खाली स्ट्रिंग coz कंटेनर / चर एक सरणी नहीं स्ट्रिंग है)

मेरे हैक करने के लिए आ रहा है: -

प्रत्येक आइटम के बीच में कुछ प्रतीक होने से एक ही स्ट्रिंग में सरणी की सामग्री को मर्ज करें और फिर इसे पुन: प्राप्त करते समय उस प्रतीक का उपयोग करके विभाजित करें। साझा वरीयताओं के साथ स्ट्रिंग जोड़ना और फिर से जोड़ना आसान है। यदि आप विभाजित करने के बारे में चिंतित हैं तो बस "जावा में एक स्ट्रिंग को विभाजित करना" देखें।

[नोट: यह ठीक काम करता है यदि आपके सरणी की सामग्री आदिम प्रकार की है जैसे स्ट्रिंग, इंट, फ्लोट, आदि यह उन जटिल सरणियों के लिए काम करेगा जिनकी अपनी संरचना है, एक फोन बुक मान लीजिए, लेकिन विलय और विभाजन एक बन जाएगा थोड़ा जटिल। ]

पुनश्च: मैं एंड्रॉइड के लिए नया हूं, इसलिए यह नहीं जानता कि क्या यह एक अच्छा हैक है, इसलिए बेहतर पता लगाने के लिए लेमेक पता है।

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