मेरे पास एक ArrayList
ऑब्जेक्ट है जिसका एक नाम और एक आइकन पॉइंटर है और मैं इसे सहेजना चाहता हूं SharedPreferences
। मैं कैसे कर सकता हूँ?
नोट: मैं डेटाबेस का उपयोग नहीं करना चाहता
जवाबों:
तो डेटा संग्रहण पर 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 या उसके बाद का उपयोग कर रहे हैं, तो एक स्ट्रिंग सेट लिखने की विधि है
एपीआई स्तर की परवाह किए बिना, साझाकरण सरणियों और ऑब्जेक्ट सरणियों की जाँच करें
बचना 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;
}
लिखना,
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();
}
साझा प्राथमिकताएं शुरू की गईं 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 के रूप में संग्रहीत की जाती हैं, इसलिए जब आप मेगाबाइट डेटा के साथ काम कर रहे होते हैं तो मैं अन्य लगातार डेटा स्टोर तंत्र का उपयोग करने की सलाह देता हूं।
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);
}
मैंने अपनी वरीयताओं में कमर के आकार की एक सरणी (पहले से ही मेरे 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 पूर्व-चयनित है।
सरल तरीका है, इसे नीचे दिए गए उदाहरण के रूप में JSON स्ट्रिंग में बदलना:
Gson gson = new Gson();
String json = gson.toJson(myObj);
फिर साझा प्राथमिकताओं में स्ट्रिंग को संग्रहीत करें। एक बार जब आपको इसकी आवश्यकता होती है तो बस साझा प्राथमिकताओं से स्ट्रिंग प्राप्त करें और वापस JSONArray या JSONObject में परिवर्तित करें (अपनी आवश्यकता के अनुसार)।
लिखने हेतु:
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;
}
यह साझा प्राथमिकताएं कोड है जिसका मैं सफलतापूर्वक उपयोग करता हूं, इस लिंक को देखें :
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());
}
}
खुश कोडिंग!
आप उपयोग कर सकते हैं 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 सिर्फ एक सेट की अनुमति है और यह एक है अव्यवस्थित सूची।
जब मुझे इस बात से इंकार किया गया, तो मुझे सीरियलिंग सॉल्यूशन मिला, जहां, आप अपनी स्ट्रिंग को सीरियस कर सकते हैं, लेकिन मैं एक हैक भी कर आया।
इसे केवल तभी पढ़ें जब आपने क्रमांकन के बारे में नहीं पढ़ा है, अन्यथा नीचे जाएं और मेरी हैक पढ़ें
क्रम में सरणी आइटम संग्रहीत करने के लिए, हम सरणी को एक स्ट्रिंग में क्रमबद्ध कर सकते हैं (एक नया वर्ग ObjectSerializer बनाकर (कोड की प्रतिलिपि बनाएं - www.androiddevcourse.com/objectserializer.html, पैकेज नाम को छोड़कर सब कुछ बदलें)
साझा प्राथमिकता में डेटा दर्ज करना:
अगला arg इस रूप में डालें, ताकि यदि डेटा पुनः प्राप्त नहीं होता है, तो यह खाली सरणी लौटाएगा (हम खिचड़ी भाषा में खाली स्ट्रिंग coz कंटेनर / चर एक सरणी नहीं स्ट्रिंग है)
मेरे हैक करने के लिए आ रहा है: -
प्रत्येक आइटम के बीच में कुछ प्रतीक होने से एक ही स्ट्रिंग में सरणी की सामग्री को मर्ज करें और फिर इसे पुन: प्राप्त करते समय उस प्रतीक का उपयोग करके विभाजित करें। साझा वरीयताओं के साथ स्ट्रिंग जोड़ना और फिर से जोड़ना आसान है। यदि आप विभाजित करने के बारे में चिंतित हैं तो बस "जावा में एक स्ट्रिंग को विभाजित करना" देखें।
[नोट: यह ठीक काम करता है यदि आपके सरणी की सामग्री आदिम प्रकार की है जैसे स्ट्रिंग, इंट, फ्लोट, आदि यह उन जटिल सरणियों के लिए काम करेगा जिनकी अपनी संरचना है, एक फोन बुक मान लीजिए, लेकिन विलय और विभाजन एक बन जाएगा थोड़ा जटिल। ]
पुनश्च: मैं एंड्रॉइड के लिए नया हूं, इसलिए यह नहीं जानता कि क्या यह एक अच्छा हैक है, इसलिए बेहतर पता लगाने के लिए लेमेक पता है।