GetDefaultSaringPreferences और getSedenPreferences के बीच अंतर


224

Android में getDefaultSharedPreferencesऔर क्या अंतर getSharedPreferencesहै? क्या कोई समझा सकता है?


लगभग-बहुत स्पष्ट अंतर यह है कि एक स्थिर है और एक नहीं है। लेकिन यह वास्तव में मायने नहीं रखता है, क्योंकि आपको Contextकिसी एक को कॉल करने के लिए एक उदाहरण की आवश्यकता है ।
लार्स

जवाबों:


224

getDefaultSharedPreferences"com.example.something_preferences" जैसे डिफ़ॉल्ट नाम का उपयोग करेगा, लेकिन getSharedPreferencesइसके लिए एक नाम की आवश्यकता होगी ।

getDefaultSharedPreferencesवास्तव में उपयोग करता है Context.getSharedPreferences(नीचे Android स्रोत से सीधे है):

public static SharedPreferences getDefaultSharedPreferences(Context context) {
    return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
        getDefaultSharedPreferencesMode());
}

private static String getDefaultSharedPreferencesName(Context context) {
    return context.getPackageName() + "_preferences";
}

private static int getDefaultSharedPreferencesMode() {
    return Context.MODE_PRIVATE;
}

9
खराब करने के लिए getDefaultSharedPreferencesNameसार्वजनिक नहीं है क्योंकि बैकअप / पुनर्स्थापना ढांचे के लिए नाम की आवश्यकता है।
मार्टिन


और वरीयता परिवर्तन के लिए कैसे सुनें, getSaringPreferences मोड में वरीयता के लिए कस्टम नाम का उपयोग करें? (डिफ़ॉल्ट नाम का उपयोग न करें जैसे getSaredPreferences "com.example.something_preferences")
डॉजैकी

क्या आप कृपया स्रोत से लिंक जोड़ सकते हैं?
Mr_and_Mrs_D

@Mr_and_Mrs_D इसे देखना आसान है। अगर मैं एक लिंक जोड़ता हूं तो यह एक विशिष्ट एपीआई संस्करण के लिए होगा, जो आप देख रहे हैं या नहीं हो सकता है।
कॉपोली

120

आइए अंतर के मूल बिंदुओं की समीक्षा करें:

  1. getDefaultSharedPreferences()डिफ़ॉल्ट प्राथमिकता-फ़ाइल नाम का उपयोग करता है। यह डिफ़ॉल्ट प्रति एप्लिकेशन सेट है, इसलिए समान एप्लिकेशन संदर्भ में सभी गतिविधियां इसे निम्न उदाहरण में आसानी से एक्सेस कर सकती हैं:

    SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this);
    if (spref.contains("email")) {
         String sEmailAddr = spref.getString("email", "");
    }

    वरीयताओं को आमतौर पर संग्रहित किया जाता है /data/data/com.package.name/shared_prefs/com.package.name_preferences.xml

  2. वैकल्पिक विधि - getSharedPreferences(name,mode)एक विशिष्ट वरीयता (फ़ाइल) नाम और एक ऑपरेशन मोड (जैसे निजी, world_readable, आदि) को इंगित करने की आवश्यकता होती है।

जैसा कि कोपोली द्वारा उल्लेख किया गया है, परिणाम समान है, लेकिन पहला विकल्प सरल है और लचीलेपन का अभाव कई वरीयता फ़ाइलों में विभाजित करने के लिए है, जो कि दूसरे विकल्प द्वारा प्रस्तुत किया जाता है getSharedPreferences()। MODE_WORLD_READABLE ऑपरेशन इंडिकेटर का उपयोग करने वाले ऐप्स के बीच वरीयताओं को साझा करना भी उपयोग करना संभव है getSharedPreferences(), लेकिन शायद ही कभी इसका उपयोग किया जाता है।

IMHO, getDefaultSharedPreferences()को सुरक्षित रूप से कई वरीयता फ़ाइल नामों की उलझन में जाने के बिना उपयोग किया जा सकता है जो टाइपोस और भ्रम की स्थिति में हैं, जब तक आप नहीं चाहते कि आपके ऐप में अलग-अलग मॉड्यूल अलग-अलग वरीयता फ़ाइलों का उपयोग करेंगे। आम तौर पर इसकी जरूरत नहीं होती है। यदि किसी ऐप को बहुत सारे मापदंडों को सहेजने की आवश्यकता है, तो शायद बाहरी डेटाबेस का उपयोग करना बेहतर होगा क्योंकि यह बेहतर डेटा सुरक्षा भी प्रदान करता है।

अगर किसी को नियमित रूप से getSaredPreferences () और getDefaultSaredPreferences () का उपयोग करने के लिए एक अच्छे कारण के बारे में पता है, तो कृपया मुझे यहाँ टिप्पणी करके बताएं।



1
और वरीयता परिवर्तन के लिए कैसे सुनें, getSaringPreferences मोड में वरीयता के लिए कस्टम नाम का उपयोग करें? (डिफ़ॉल्ट नाम का उपयोग न करें जैसे getSaredPreferences "com.example.something_preferences")
डॉजैकी

Drjacky मैं कहूंगा कि आप अपनी वरीयताओं को किसी प्रकार के सत्र-जैसे ऑब्जेक्ट में लपेटेंगे: वर्ग सत्र {prefs = getSaredPreferences () ...} और फिर आप जिन चीज़ों की निगरानी करना चाहते हैं, उनके लिए गेटर्स और सेटर का उपयोग करें। जब बसने वालों को बुलाया जाता है, तो आप सेटर लॉजिक में घटनाओं को ट्रिगर कर सकते हैं।
एलेक्स वीवर्स

2

मुझे पता है कि यह पोस्ट थोड़ी पुरानी है, लेकिन v7 समर्थन पुस्तकालय के 24.0.1 के बाद से आप कहीं भी उपयोग करके डिफ़ॉल्ट प्राथमिकताओं को प्राप्त कर सकते हैं

// context might be an application context, activity, ..
// so if you want to get your apps defaults, pass an activity context
PreferenceManager.getDefaultSharedPreferences(context)

Https://developer.android.com/reference/android/support/v7/preference/PreferenceManager#getdefaults सहायता के संदर्भ देखें


पसंद मैनजेंडर को Android Q में अपदस्थ किया जा रहा है। आप अभी भी चीजों का संदर्भ.गेटशेयरिंगप्रेमीशन का उपयोग कर सकते हैं। इस कॉल को संदर्भ में बदल दिया गया है ।getSaredPreferences ("$ {packageName} _preferences", MODE_PRIVATE)
केविन

2
ऐसा लग रहा है कि पसंद किया जा रहा है कि यह सिर्फ Androix में ले जाया जा रहा है। डेवलपर
.android.com

1

एक 3 फ़ंक्शन भी है:

public SharedPreferences Activity.getPreferences(int mode) {}

मेरा प्रश्न और उत्तर यहां देखें: Android की साझा प्राथमिकताओं के साथ मेस - किस फ़ंक्शन का उपयोग करना है?


यह गतिविधि स्रोत कोड से getSaredPreferences () के लिए एक आवरण है: सार्वजनिक SharedPreferences getPreferences (int मोड) {रिटर्न getSaredPreferences (getLocalClassName (), मोड); }
tarn

1

दोनों getSaredPreferences () और getDefaultSaredPreferences () का उपयोग एप्लिकेशन-स्तर की प्राथमिकताओं तक पहुंचने के लिए किया जाता है। getDefaultSaringPreferences () का उपयोग करना बेहतर है क्योंकि यह SharedPreferences ऑब्जेक्ट देता है जो डिफ़ॉल्ट रूप से प्राथमिकता के साथ काम करता है।


0

ध्यान रखें कि डिफ़ॉल्ट साझा प्राथमिकताओं का उपयोग करना आपके पैकेज नाम के साथ साझा प्राथमिकताओं का उपयोग करने के समान नहीं है:

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

=> साझा प्राथमिकताओं का नाम: " com.my.packagename "

PreferenceManager.getDefaultSharedPreferences(context);

=> साझा प्राथमिकताओं का नाम: " com.my.packagename_preferences "

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