Android
SharedPreferences
खोज…
परिचय
SharedPreferences कुंजी-मान जोड़े के रूप में डिस्क में डेटा को सहेजने का एक तरीका प्रदान करता है।
वाक्य - विन्यास
प्रसंग विधि
- सार्वजनिक SharedPreferences getSaringPreferences (स्ट्रिंग नाम, इंट मोड)
गतिविधि विधि
- सार्वजनिक साझा कार्यक्रम
SharedPreferences विधियाँ
- सार्वजनिक साझाकरण। संपादक संपादित करें ()
- सार्वजनिक बूलियन में ()
- सार्वजनिक मानचित्र <string;> getAll ()
- सार्वजनिक बूलियन getBoolean (स्ट्रिंग कुंजी, बूलियन डिफ़ाल्यू)
- सार्वजनिक फ्लोट getFloat (स्ट्रिंग कुंजी, फ्लोट डिफ़ाल्यू)
- सार्वजनिक int getInt (स्ट्रिंग कुंजी, int defValue)
- सार्वजनिक लंबे getLong (स्ट्रिंग कुंजी, लंबे समय तक बचाव)
- सार्वजनिक स्ट्रिंग getString (स्ट्रिंग कुंजी, स्ट्रिंग डिफ़ाल्यू)
- सार्वजनिक सेट getStringSet (स्ट्रिंग कुंजी, सेट डिफ़ाल्यूज़)
- सार्वजनिक शून्य रजिस्टरऑनडेअरिंगश्रेणीप्रदर्शनसंचालिका (साझाकरण)
- सार्वजनिक शून्य unregisterOnSaredPreferenceChangeListener (SharedPreferences.OnSaredPreferenceChangeListener श्रोता)
SharedPreferences.Editor तरीके
- सार्वजनिक शून्य लागू ()
- सार्वजनिक बूलियन प्रतिबद्ध ()
- सार्वजनिक साझाकरण
- सार्वजनिक शेयरप्रेमी। एडिटर पुटीनियन (स्ट्रिंग कुंजी, बूलियन मूल्य)
- सार्वजनिक शेयरडिप्रेसेर्स.Editor putFloat (स्ट्रिंग कुंजी, फ्लोट मूल्य)
- सार्वजनिक शेयरडिप्रेसेर्स.Editor putInt (स्ट्रिंग कुंजी, इंट वैल्यू)
- सार्वजनिक शेयरडिप्रेफरेंस.ऑडिटर पुटोंग (स्ट्रिंग कुंजी, लंबे मूल्य)
- सार्वजनिक साझाकरण। संपादक। स्ट्रिंग (स्ट्रिंग कुंजी, स्ट्रिंग मान)
- सार्वजनिक साझाकरण। संदर्भकर्ता पुटस्ट्रिंगसेट (स्ट्रिंग कुंजी, मान सेट करें)
- सार्वजनिक साझाकरण। संपादक हटा दें (स्ट्रिंग कुंजी)
पैरामीटर
पैरामीटर | विवरण |
---|---|
चाभी | एक गैर-अशक्त String पैरामीटर की पहचान कर रहा है। इसमें व्हॉट्सएप या नॉन-प्रिंटबल शामिल हो सकते हैं। यह केवल आपके ऐप (और XML फ़ाइल में) के अंदर उपयोग किया जाता है, इसलिए इसे नाम स्थान पर रखने की आवश्यकता नहीं है, लेकिन इसे अपने स्रोत कोड में एक निरंतर के रूप में रखना एक अच्छा विचार है। इसे स्थानीय मत करो। |
defValue | सभी प्राप्त फ़ंक्शंस एक डिफ़ॉल्ट मान लेते हैं, जो कि दिए गए कुंजी को SharedPreferences में मौजूद नहीं होने पर वापस कर दिया जाता है। यदि कुंजी मौजूद है तो इसे वापस नहीं किया जाता है, लेकिन मूल्य में गलत प्रकार है: उस स्थिति में आपको ClassCastException मिलता है। |
टिप्पणियों
बड़ी मात्रा में डेटा संग्रहीत करने के लिए
SharedPreferences
उपयोग नहीं किया जाना चाहिए। ऐसे उद्देश्यों के लिए,SQLiteDatabase
का उपयोग करना बेहतर है।SharedPreferences
केवल एकल प्रक्रिया है, जब तक कि आप पदावनत मोडMODE_MULTI_PROCESS
उपयोग न करें। इसलिए यदि आपके ऐप में कई प्रक्रियाएँ हैं, तो आप मुख्य प्रक्रिया केSharedPreferences
को किसी अन्य प्रक्रिया में नहीं पढ़ पाएंगे। ऐसे मामलों में, आपको प्रक्रियाओं में डेटा साझा करने के लिए एक अन्य तंत्र का उपयोग करना चाहिए, लेकिनMODE_MULTI_PROCESS
उपयोग न करें क्योंकि यह विश्वसनीय होने के साथ-साथ पदावनत भी नहीं है।एप्लिकेशन के
context
सभी तक पहुंचने के लिएSingleton
वर्ग मेंSharedPreferences
उदाहरण का उपयोग करना बेहतर है। यदि आप इसे केवल विशेष गतिविधि के लिए उपयोग करना चाहते हैं तोgetPreferences()
लिएgetPreferences()
।स्पष्ट पाठ में संवेदनशील सूचना के संचय का उपयोग करते समय से बचें
SharedPreferences
के बाद से यह आसानी से पढ़ा जा सकता है।
आधिकारिक दस्तावेज
https://developer.android.com/reference/android/content/SharedPreferences.html
शेयर्डप्रिफरेंस को मान पढ़ें और लिखें
public class MyActivity extends Activity {
private static final String PREFS_FILE = "NameOfYourPrefrenceFile";
// PREFS_MODE defines which apps can access the file
private static final int PREFS_MODE = Context.MODE_PRIVATE;
// you can use live template "key" for quickly creating keys
private static final String KEY_BOOLEAN = "KEY_FOR_YOUR_BOOLEAN";
private static final String KEY_STRING = "KEY_FOR_YOUR_STRING";
private static final String KEY_FLOAT = "KEY_FOR_YOUR_FLOAT";
private static final String KEY_INT = "KEY_FOR_YOUR_INT";
private static final String KEY_LONG = "KEY_FOR_YOUR_LONG";
@Override
protected void onStart() {
super.onStart();
// Get the saved flag (or default value if it hasn't been saved yet)
SharedPreferences settings = getSharedPreferences(PREFS_FILE, PREFS_MODE);
// read a boolean value (default false)
boolean booleanVal = settings.getBoolean(KEY_BOOLEAN, false);
// read an int value (Default 0)
int intVal = settings.getInt(KEY_INT, 0);
// read a string value (default "my string")
String str = settings.getString(KEY_STRING, "my string");
// read a long value (default 123456)
long longVal = settings.getLong(KEY_LONG, 123456);
// read a float value (default 3.14f)
float floatVal = settings.getFloat(KEY_FLOAT, 3.14f);
}
@Override
protected void onStop() {
super.onStop();
// Save the flag
SharedPreferences settings = getSharedPreferences(PREFS_FILE, PREFS_MODE);
SharedPreferences.Editor editor = settings.edit();
// write a boolean value
editor.putBoolean(KEY_BOOLEAN, true);
// write an integer value
editor.putInt(KEY_INT, 123);
// write a string
editor.putString(KEY_STRING, "string value");
// write a long value
editor.putLong(KEY_LONG, 456876451);
// write a float value
editor.putFloat(KEY_FLOAT, 1.51f);
editor.apply();
}
}
getSharedPreferences()
Context
वर्ग से एक विधि है - जो Activity
विस्तार करती है। यदि आपको अन्य वर्गों से getSharedPreferences()
विधि का उपयोग करने की आवश्यकता है, तो आप एक Activity
, View
, या Application
से Context
ऑब्जेक्ट संदर्भ के साथ reference.getSaringPreferences context.getSharedPreferences()
उपयोग कर सकते हैं।
चाबी निकालना
private static final String MY_PREF = "MyPref";
// ...
SharedPreferences prefs = ...;
// ...
SharedPreferences.Editor editor = prefs.edit();
editor.putString(MY_PREF, "value");
editor.remove(MY_PREF);
editor.apply();
apply()
बाद, prefs
में "कुंजी" -> "मान" होता है, इसके अलावा जो कुछ भी पहले से ही निहित है। भले ही ऐसा लगता है कि मैंने "कुंजी" जोड़ा और फिर इसे हटा दिया, हटा वास्तव में पहले होता है। Editor
में परिवर्तन सभी एक बार में लागू होते हैं, न कि उस क्रम में जब आपने उन्हें जोड़ा था। सभी हटाने से पहले होता है सभी डालता है।
SharedPreferences का उपयोग करके सेटिंग स्क्रीन लागू करना
SharedPreferences
का एक उपयोग आपके ऐप में "सेटिंग" स्क्रीन को लागू करना है, जहां उपयोगकर्ता अपनी प्राथमिकताएं / विकल्प सेट कर सकता है। ऐशे ही:
एक SharedPreferences
में उपयोगकर्ता की प्राथमिकताओं को बचाता है। वरीयतास्क्रीन बनाने के लिए, आपको कुछ चीज़ें चाहिए:
उपलब्ध विकल्पों को परिभाषित करने के लिए एक XML फ़ाइल:
यह /res/xml/preferences.xml
में जाता है, और उपरोक्त सेटिंग्स स्क्रीन के लिए, यह इस तरह दिखता है:
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="General options">
<CheckBoxPreference
android:key = "silent_mode"
android:defaultValue="false"
android:title="Silent Mode"
android:summary="Mute all sounds from this app" />
<SwitchPreference
android:key="awesome_mode"
android:defaultValue="false"
android:switchTextOn="Yes"
android:switchTextOff="No"
android:title="Awesome mode™"
android:summary="Enable the Awesome Mode™ feature"/>
<EditTextPreference
android:key="custom_storage"
android:defaultValue="/sdcard/data/"
android:title="Custom storage location"
android:summary="Enter the directory path where you want data to be saved. If it does not exist, it will be created."
android:dialogTitle="Enter directory path (eg. /sdcard/data/ )"/>
</PreferenceCategory>
</PreferenceScreen>
यह सेटिंग स्क्रीन में उपलब्ध विकल्पों को परिभाषित करता है। Android डेवलपर डॉक्यूमेंट में वरीयता वर्ग में कई अन्य प्रकार की Preference
सूचीबद्ध हैं।
अगला, हमें अपने प्राथमिकताएं उपयोगकर्ता इंटरफ़ेस की मेजबानी के लिए एक गतिविधि की आवश्यकता है। इस मामले में, यह काफी छोटा है, और इस तरह दिखता है:
package com.example.preferences;
import android.preference.PreferenceActivity;
import android.os.Bundle;
public class PreferencesActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
यह PreferenceActivity
सक्रियता को बढ़ाता है, और वरीयताओं के स्क्रीन के लिए उपयोगकर्ता इंटरफ़ेस प्रदान करता है। इसे सामान्य गतिविधि की तरह ही शुरू किया जा सकता है, इस मामले में, कुछ इस तरह से:
Intent i = new Intent(this, PreferencesActivity.class);
startActivity(i);
अपने AndroidManifest.xml
PreferencesActivity
जोड़ना न भूलें।
आपके ऐप के अंदर प्राथमिकताओं के मूल्यों को प्राप्त करना काफी सरल है, बस अपने XML में परिभाषित डिफ़ॉल्ट मान सेट करने के लिए, पहले setDefaultValues()
कॉल करें, और उसके बाद डिफ़ॉल्ट SharedPreferences
प्राप्त करें। एक उदाहरण:
//set the default values we defined in the XML
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
//get the values of the settings options
boolean silentMode = preferences.getBoolean("silent_mode", false);
boolean awesomeMode = preferences.getBoolean("awesome_mode", false);
String customStorage = preferences.getString("custom_storage", "");
किसी विशेष SharedPreferences फ़ाइल से सभी संग्रहीत प्रविष्टियों को पुनः प्राप्त करें
getAll()
विधि प्राथमिकताओं से सभी मूल्यों को पुनः प्राप्त करती है। हम की वर्तमान सामग्री लॉग इन करने के लिए इसका इस्तेमाल कर सकते हैं, उदाहरण के लिए, SharedPreferences
:
private static final String PREFS_FILE = "MyPrefs";
public static void logSharedPreferences(final Context context) {
SharedPreferences sharedPreferences = context.getSharedPreferences(PREFS_FILE, Context.MODE_PRIVATE);
Map<String, ?> allEntries = sharedPreferences.getAll();
for (Map.Entry<String, ?> entry : allEntries.entrySet()) {
final String key = entry.getKey();
final Object value = entry.getValue();
Log.d("map values", key + ": " + value);
}
}
प्रलेखन संशोधित करने के बारे में चेतावनी देता है Collection
द्वारा दिया getAll
:
ध्यान दें कि आपको इस विधि द्वारा लौटाए गए संग्रह को संशोधित नहीं करना चाहिए, या इसकी किसी भी सामग्री में परिवर्तन नहीं करना चाहिए। यदि आप करते हैं तो आपके संग्रहीत डेटा की स्थिरता की गारंटी नहीं है।
SharedPreferences परिवर्तनों के लिए सुनना
SharedPreferences sharedPreferences = ...;
sharedPreferences.registerOnSharedPreferenceChangeListener(mOnSharedPreferenceChangeListener);
private final SharedPreferences.OnSharedPreferenceChangeListener mOnSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
//TODO
}
}
कृपया ध्यान दें:
- श्रोता केवल तभी आग लगाएगा जब मान जोड़ा या बदला गया था, उसी मान को सेट करने से वह कॉल नहीं करेगा;
- श्रोता को एक सदस्य चर में सहेजने की जरूरत है और एक अनाम वर्ग के साथ नहीं , क्योंकि
registerOnSharedPreferenceChangeListener
इसे एक कमजोर संदर्भ के साथ संग्रहीत करता है, इसलिए यह कचरा एकत्र किया जाएगा; - एक सदस्य चर का उपयोग करने के बजाय, इसे सीधे वर्ग द्वारा भी लागू किया जा सकता है और फिर
registerOnSharedPreferenceChangeListener(this);
कॉल करेंregisterOnSharedPreferenceChangeListener(this);
- श्रोता को अपंजीकृत करने के लिए याद रखें जब इसे
unregisterOnSharedPreferenceChangeListener
का उपयोग करने की आवश्यकता नहीं है।
सिंग्लटन के साथ शेयर्डपिरिफर्स को डेटा पढ़ना और लिखना
सभी प्रकार के डेटा को पढ़ने और लिखने के लिए SharedPreferences प्रबंधक (सिंगलटन) वर्ग।
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import com.google.gson.Gson;
import java.lang.reflect.Type;
/**
* Singleton Class for accessing SharedPreferences,
* should be initialized once in the beginning by any application component using static
* method initialize(applicationContext)
*/
public class SharedPrefsManager {
private static final String TAG = SharedPrefsManager.class.getName();
private SharedPreferences prefs;
private static SharedPrefsManager uniqueInstance;
public static final String PREF_NAME = "com.example.app";
private SharedPrefsManager(Context appContext) {
prefs = appContext.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
}
/**
* Throws IllegalStateException if this class is not initialized
*
* @return unique SharedPrefsManager instance
*/
public static SharedPrefsManager getInstance() {
if (uniqueInstance == null) {
throw new IllegalStateException(
"SharedPrefsManager is not initialized, call initialize(applicationContext) " +
"static method first");
}
return uniqueInstance;
}
/**
* Initialize this class using application Context,
* should be called once in the beginning by any application Component
*
* @param appContext application context
*/
public static void initialize(Context appContext) {
if (appContext == null) {
throw new NullPointerException("Provided application context is null");
}
if (uniqueInstance == null) {
synchronized (SharedPrefsManager.class) {
if (uniqueInstance == null) {
uniqueInstance = new SharedPrefsManager(appContext);
}
}
}
}
private SharedPreferences getPrefs() {
return prefs;
}
/**
* Clears all data in SharedPreferences
*/
public void clearPrefs() {
SharedPreferences.Editor editor = getPrefs().edit();
editor.clear();
editor.commit();
}
public void removeKey(String key) {
getPrefs().edit().remove(key).commit();
}
public boolean containsKey(String key) {
return getPrefs().contains(key);
}
public String getString(String key, String defValue) {
return getPrefs().getString(key, defValue);
}
public String getString(String key) {
return getString(key, null);
}
public void setString(String key, String value) {
SharedPreferences.Editor editor = getPrefs().edit();
editor.putString(key, value);
editor.apply();
}
public int getInt(String key, int defValue) {
return getPrefs().getInt(key, defValue);
}
public int getInt(String key) {
return getInt(key, 0);
}
public void setInt(String key, int value) {
SharedPreferences.Editor editor = getPrefs().edit();
editor.putInt(key, value);
editor.apply();
}
public long getLong(String key, long defValue) {
return getPrefs().getLong(key, defValue);
}
public long getLong(String key) {
return getLong(key, 0L);
}
public void setLong(String key, long value) {
SharedPreferences.Editor editor = getPrefs().edit();
editor.putLong(key, value);
editor.apply();
}
public boolean getBoolean(String key, boolean defValue) {
return getPrefs().getBoolean(key, defValue);
}
public boolean getBoolean(String key) {
return getBoolean(key, false);
}
public void setBoolean(String key, boolean value) {
SharedPreferences.Editor editor = getPrefs().edit();
editor.putBoolean(key, value);
editor.apply();
}
public boolean getFloat(String key) {
return getFloat(key, 0f);
}
public boolean getFloat(String key, float defValue) {
return getFloat(key, defValue);
}
public void setFloat(String key, Float value) {
SharedPreferences.Editor editor = getPrefs().edit();
editor.putFloat(key, value);
editor.apply();
}
/**
* Persists an Object in prefs at the specified key, class of given Object must implement Model
* interface
*
* @param key String
* @param modelObject Object to persist
* @param <M> Generic for Object
*/
public <M extends Model> void setObject(String key, M modelObject) {
String value = createJSONStringFromObject(modelObject);
SharedPreferences.Editor editor = getPrefs().edit();
editor.putString(key, value);
editor.apply();
}
/**
* Fetches the previously stored Object of given Class from prefs
*
* @param key String
* @param classOfModelObject Class of persisted Object
* @param <M> Generic for Object
* @return Object of given class
*/
public <M extends Model> M getObject(String key, Class<M> classOfModelObject) {
String jsonData = getPrefs().getString(key, null);
if (null != jsonData) {
try {
Gson gson = new Gson();
M customObject = gson.fromJson(jsonData, classOfModelObject);
return customObject;
} catch (ClassCastException cce) {
Log.d(TAG, "Cannot convert string obtained from prefs into collection of type " +
classOfModelObject.getName() + "\n" + cce.getMessage());
}
}
return null;
}
/**
* Persists a Collection object in prefs at the specified key
*
* @param key String
* @param dataCollection Collection Object
* @param <C> Generic for Collection object
*/
public <C> void setCollection(String key, C dataCollection) {
SharedPreferences.Editor editor = getPrefs().edit();
String value = createJSONStringFromObject(dataCollection);
editor.putString(key, value);
editor.apply();
}
/**
* Fetches the previously stored Collection Object of given type from prefs
*
* @param key String
* @param typeOfC Type of Collection Object
* @param <C> Generic for Collection Object
* @return Collection Object which can be casted
*/
public <C> C getCollection(String key, Type typeOfC) {
String jsonData = getPrefs().getString(key, null);
if (null != jsonData) {
try {
Gson gson = new Gson();
C arrFromPrefs = gson.fromJson(jsonData, typeOfC);
return arrFromPrefs;
} catch (ClassCastException cce) {
Log.d(TAG, "Cannot convert string obtained from prefs into collection of type " +
typeOfC.toString() + "\n" + cce.getMessage());
}
}
return null;
}
public void registerPrefsListener(SharedPreferences.OnSharedPreferenceChangeListener listener) {
getPrefs().registerOnSharedPreferenceChangeListener(listener);
}
public void unregisterPrefsListener(
SharedPreferences.OnSharedPreferenceChangeListener listener) {
getPrefs().unregisterOnSharedPreferenceChangeListener(listener);
}
public SharedPreferences.Editor getEditor() {
return getPrefs().edit();
}
private static String createJSONStringFromObject(Object object) {
Gson gson = new Gson();
return gson.toJson(object);
}
}
Model
interface
जो कि Gson
से बचने के लिए Gson
जाने वाली कक्षाओं द्वारा कार्यान्वित किया जाता है।
public interface Model {
}
Model
इंटरफ़ेस के लिए नियम नियम:
-keep interface com.example.app.Model
-keep class * implements com.example.app.Model { *;}
SharedPreferences की एक वस्तु को तत्काल करने के विभिन्न तरीके
आप कई तरीकों से SharedPreferences तक पहुँच सकते हैं:
डिफ़ॉल्ट साझाकरण फ़ाइल प्राप्त करें:
import android.preference.PreferenceManager;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
एक विशिष्ट SharedPreferences फ़ाइल प्राप्त करें:
public static final String PREF_FILE_NAME = "PrefFile";
SharedPreferences prefs = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);
दूसरे ऐप से साझा करें
// Note that the other app must declare prefs as MODE_WORLD_WRITEABLE
final ArrayList<HashMap<String,String>> LIST = new ArrayList<HashMap<String,String>>();
Context contextOtherApp = createPackageContext("com.otherapp", Context.MODE_WORLD_WRITEABLE);
SharedPreferences prefs = contextOtherApp.getSharedPreferences("pref_file_name", Context.MODE_WORLD_READABLE);
getPreferences (int) VS getSaringPreferences (स्ट्रिंग, इंट)
getPreferences(int)
डॉक्स में वर्णित Activity's class name
बचाई गई प्राथमिकताएं लौटाता है:
उन वरीयताओं तक पहुँचने के लिए एक साझापदप्रदर्शन ऑब्जेक्ट प्राप्त करें जो इस गतिविधि के लिए निजी हैं। यह बस इस गतिविधि के वर्ग नाम को वरीयताओं के नाम के रूप में पास करके अंतर्निहित getSaredPreferences (स्ट्रिंग, इंट) पद्धति को कॉल करता है।
GetSaredPreferences (स्ट्रिंग नाम, इंट मोड) का उपयोग करते समय विधि दिए गए name
तहत सहेजे गए Prefs को लौटाती है। डॉक्स में:
प्राथमिकताएँ फ़ाइल 'नाम' की सामग्री को पुनः प्राप्त करें और साझा करें, एक साझाप्रेमीकरण लौटाएं जिसके माध्यम से आप इसके मूल्यों को पुनः प्राप्त और संशोधित कर सकते हैं।
इसलिए अगर SharedPreferences
में सेव की जा रही वैल्यू को ऐप में इस्तेमाल किया जाना है, तो किसी को एक निश्चित नाम के साथ getSharedPreferences (String name, int mode)
उपयोग करना चाहिए। के रूप में, getPreferences(int)
रिटर्न का उपयोग करते हुए / Activity
से संबंधित वरीयताओं को बुलाते हुए बचाता है।
कमेटी बनाम लागू करें
editor.apply()
विधि, अतुल्यकालिक है, जबकि editor.commit()
तुल्यकालिक है।
जाहिर है, आपको या तो apply()
करना चाहिए apply()
या commit()
।
SharedPreferences settings = getSharedPreferences(PREFS_FILE, MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(PREF_CONST, true);
// This will asynchronously save the shared preferences without holding the current thread.
editor.apply();
SharedPreferences settings = getSharedPreferences(PREFS_FILE, MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(PREF_CONST, true);
// This will synchronously save the shared preferences while holding the current thread until done and returning a success flag.
boolean result = editor.commit();
apply()
2.3 (एपीआई 9) में जोड़ा गया था, यह सफलता या विफलता का संकेत देने वाले बूलियन को लौटाए बिना करता है।
commit()
सही बचता है अगर बचा काम करता है, तो गलत है।
apply()
को जोड़ा गया था क्योंकि एंड्रॉइड देव टीम ने देखा था कि लगभग किसी ने रिटर्न वैल्यू पर ध्यान नहीं दिया है, इसलिए यह तेज़ है क्योंकि यह अतुल्यकालिक है।
commit()
विपरीत, जो अपनी प्राथमिकताओं को लगातार स्टोरेज के लिए सिंक्रोनाइज़ करता है, इन-मेमोरी SharedPreferences
में इसके बदलावों को तुरंत apply()
करता है, लेकिन डिस्क पर एसिंक्रोनस कमिट शुरू कर देता है और आपको किसी भी विफलता के बारे में सूचित नहीं किया जाएगा। यदि इस SharedPreferences
पर एक अन्य संपादक नियमित रूप से एक commit()
जबकि एक apply()
अभी भी बकाया है, तो commit()
तब तक अवरुद्ध हो जाएगा जब तक कि सभी async कमिट (लागू) पूरा नहीं हो जाते हैं और साथ ही किसी अन्य सिंक को लंबित हो जाता है।
SharedPreferences में समर्थित डेटा प्रकार
SharedPreferences
आपको केवल आदिम डेटा प्रकार ( boolean
, float
, long
, int
, String
और string set
) को स्टोर करने की अनुमति देता है। आप SharedPreferences
में अधिक जटिल वस्तुओं को संग्रहीत नहीं कर सकते हैं, और ऐसा वास्तव में उपयोगकर्ता सेटिंग्स या समान स्टोर करने के लिए एक जगह होने के लिए है, इसका मतलब उपयोगकर्ता डेटा रखने के लिए डेटाबेस नहीं है (जैसे कि उपयोगकर्ता के लिए बनाई गई टूडू सूची को सहेजना)।
SharedPreferences
में कुछ संग्रहीत करने के लिए आप एक कुंजी और एक मूल्य का उपयोग करते हैं। कुंजी यह है कि आप बाद में क्या संग्रहीत कर सकते हैं और मूल्य डेटा जिसे आप स्टोर करना चाहते हैं, को संदर्भित कर सकते हैं।
String keyToUseToFindLater = "High Score";
int newHighScore = 12938;
//getting SharedPreferences & Editor objects
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
//saving an int in the SharedPreferences file
editor.putInt(keyToUseToFindLater, newHighScore);
editor.commit();
स्टोर करें, पुनः प्राप्त करें, निकालें और साझा किए गए डेटा से डेटा साफ़ करें
SharedPreferences BuyyaPref बनाएँ
SharedPreferences pref = getApplicationContext().getSharedPreferences("BuyyaPref", MODE_PRIVATE);
Editor editor = pref.edit();
डेटा को कुंजी / वैल्यू जोड़ी के रूप में संग्रहीत करना
editor.putBoolean("key_name1", true); // Saving boolean - true/false
editor.putInt("key_name2", 10); // Saving integer
editor.putFloat("key_name3", 10.1f); // Saving float
editor.putLong("key_name4", 1000); // Saving long
editor.putString("key_name5", "MyString"); // Saving string
// Save the changes in SharedPreferences
editor.commit(); // commit changes
SharedPreferences डेटा प्राप्त करें
यदि कुंजी के लिए मान मौजूद नहीं है, तो दूसरा परम मान लौटाएं (इस मामले में अशक्त, यह डिफ़ॉल्ट मान जैसा है)
pref.getBoolean("key_name1", null); // getting boolean
pref.getInt("key_name2", null); // getting Integer
pref.getFloat("key_name3", null); // getting Float
pref.getLong("key_name4", null); // getting Long
pref.getString("key_name5", null); // getting String
SharedPreferences से मुख्य मूल्य हटाना
editor.remove("key_name3"); // will delete key key_name3
editor.remove("key_name4"); // will delete key key_name4
// Save the changes in SharedPreferences
editor.commit(); // commit changes
SharedPreferences से सभी डेटा को साफ़ करें
editor.clear();
editor.commit(); // commit changes
स्ट्रिंगसेट के साथ प्री-हनीकॉम्ब का समर्थन करें
यहाँ उपयोगिता वर्ग है:
public class SharedPreferencesCompat {
public static void putStringSet(SharedPreferences.Editor editor, String key, Set<String> values) {
if (Build.VERSION.SDK_INT >= 11) {
while (true) {
try {
editor.putStringSet(key, values).apply();
break;
} catch (ClassCastException ex) {
// Clear stale JSON string from before system upgrade
editor.remove(key);
}
}
} else putStringSetToJson(editor, key, values);
}
public static Set<String> getStringSet(SharedPreferences prefs, String key, Set<String> defaultReturnValue) {
if (Build.VERSION.SDK_INT >= 11) {
try {
return prefs.getStringSet(key, defaultReturnValue);
} catch (ClassCastException ex) {
// If user upgraded from Gingerbread to something higher read the stale JSON string
return getStringSetFromJson(prefs, key, defaultReturnValue);
}
} else return getStringSetFromJson(prefs, key, defaultReturnValue);
}
private static Set<String> getStringSetFromJson(SharedPreferences prefs, String key, Set<String> defaultReturnValue) {
final String input = prefs.getString(key, null);
if (input == null) return defaultReturnValue;
try {
HashSet<String> set = new HashSet<>();
JSONArray json = new JSONArray(input);
for (int i = 0, size = json.length(); i < size; i++) {
String value = json.getString(i);
set.add(value);
}
return set;
} catch (JSONException e) {
e.printStackTrace();
return defaultReturnValue;
}
}
private static void putStringSetToJson(SharedPreferences.Editor editor, String key, Set<String> values) {
JSONArray json = new JSONArray(values);
if (Build.VERSION.SDK_INT >= 9)
editor.putString(key, json.toString()).apply();
else
editor.putString(key, json.toString()).commit();
}
private SharedPreferencesCompat() {}
}
स्ट्रिंग डेटा डेटा प्रकार के रूप में वरीयताओं को बचाने के लिए एक उदाहरण है:
Set<String> sets = new HashSet<>();
sets.add("John");
sets.add("Nicko");
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferencesCompat.putStringSet(preferences.edit(), "pref_people", sets);
उन्हें वापस पाने के लिए:
Set<String> people = SharedPreferencesCompat.getStringSet(preferences, "pref_people", new HashSet<String>());
संदर्भ: Android समर्थन वरीयताएँ
EditTextPreference के लिए फ़िल्टर जोड़ें
यह वर्ग बनाएं:
public class InputFilterMinMax implements InputFilter {
private int min, max;
public InputFilterMinMax(int min, int max) {
this.min = min;
this.max = max;
}
public InputFilterMinMax(String min, String max) {
this.min = Integer.parseInt(min);
this.max = Integer.parseInt(max);
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
try {
int input = Integer.parseInt(dest.toString() + source.toString());
if (isInRange(min, max, input))
return null;
} catch (NumberFormatException nfe) { }
return "";
}
private boolean isInRange(int a, int b, int c) {
return b > a ? c >= a && c <= b : c >= b && c <= a;
}
}
उपयोग :
EditText compressPic = ((EditTextPreference) findPreference(getString("pref_key_compress_pic"))).getEditText();
compressPic.setFilters(new InputFilter[]{ new InputFilterMinMax(1, 100) });