DataStore प्राथमिकताएँ
SharedPreferences को आधुनिक DataStore लाइब्रेरी से बदलें। डेटा को Kotlin Flow के रूप में पढ़ें, edit{} से लिखें और त्रुटियों को सुरक्षित रूप से संभालें।
DataStore प्राथमिकताएँ, CoddyKit पर Android Academy का एक निःशुल्क पाठ है। यह 6 में से 5वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Android Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Android Academy पाठ्यक्रम में कुल 6 पाठ शामिल हैं।
DataStore क्यों?
DataStore, SharedPreferences का आधुनिक विकल्प है। यह वास्तविक समस्याओं का समाधान करता है:
- SharedPreferences UI थ्रेड को रोकता है — DataStore पूरी तरह अतुल्यकालिक है
- SharedPreferences बिना संभाली गई त्रुटियाँ उत्पन्न कर सकता है — DataStore Flow के माध्यम से त्रुटियों को संभालता है
- DataStore प्रकार-सुरक्षित (Preferences) या स्कीमा-सुरक्षित (Proto) है
- Kotlin Coroutines और Flow के साथ मूल रूप से काम करता है
डेटास्टोर के दो प्रकार
अपने उपयोग के अनुसार सही प्रकार चुनें:
- Preferences डेटास्टोर — कुंजी-मान युग्म, किसी स्कीमा की आवश्यकता नहीं। सेट अप करना सबसे आसान। ऐप सेटिंग और उपयोगकर्ता प्राथमिकताओं के लिए सर्वोत्तम।
- Proto डेटास्टोर — Protocol Buffers का उपयोग करने वाली टाइप वाली ऑब्जेक्ट। इसके लिए .proto स्कीमा फ़ाइल आवश्यक है। संरचित डेटा के लिए सर्वोत्तम।
इस पाठ में Preferences डेटास्टोर शामिल है।
निर्भरता जोड़ना
app/build.gradle में डेटास्टोर जोड़ें:
// app/build.gradle
dependencies {
implementation 'androidx.datastore:datastore-preferences:1.1.1'
// Coroutines (likely already in your project)
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'
}डेटास्टोर इंस्टेंस बनाना
टॉप-लेवल डेलीगेट का उपयोग करके डेटास्टोर को एक बार बनाएँ। आमतौर पर इसे एक स्वतंत्र फ़ाइल में किया जाता है:
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.preferencesDataStore
// Top-level property — creates a single DataStore instance per Context
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "user_prefs")कुंजियाँ परिभाषित करना
कुंजियाँ सामान्य स्ट्रिंग नहीं, बल्कि टाइप-सुरक्षित ऑब्जेक्ट होती हैं। उन्हें सही फ़ैक्टरी फ़ंक्शन से बनाएँ:
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.intPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey
object PreferencesKeys {
val DARK_MODE = booleanPreferencesKey("dark_mode")
val USER_NAME = stringPreferencesKey("user_name")
val LAUNCH_COUNT = intPreferencesKey("launch_count")
}डेटा लिखना
edit { } का उपयोग करके किसी कॉरूटीन के अंदर लिखें:
import androidx.datastore.preferences.core.edit
// In a ViewModel or Repository:
suspend fun saveDarkMode(enabled: Boolean) {
context.dataStore.edit { prefs ->
prefs[PreferencesKeys.DARK_MODE] = enabled
}
}
suspend fun incrementLaunchCount() {
context.dataStore.edit { prefs ->
val current = prefs[PreferencesKeys.LAUNCH_COUNT] ?: 0
prefs[PreferencesKeys.LAUNCH_COUNT] = current + 1
}
}Flow के साथ डेटा पढ़ना
डेटास्टोर डेटा को Flow के रूप में उपलब्ध कराता है। आवश्यक मान निकालने के लिए map का उपयोग करें:
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
val darkModeFlow: Flow<Boolean> = context.dataStore.data
.map { prefs ->
prefs[PreferencesKeys.DARK_MODE] ?: false // default = false
}
val userNameFlow: Flow<String> = context.dataStore.data
.map { prefs ->
prefs[PreferencesKeys.USER_NAME] ?: "Guest"
}ViewModel में संग्रह करना
कुशल संग्रह के लिए stateIn का उपयोग करके डेटास्टोर के Flow को ViewModel से उपलब्ध कराएँ:
class SettingsViewModel(private val repo: SettingsRepository) : ViewModel() {
val isDarkMode: StateFlow<Boolean> = repo.darkModeFlow
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = false
)
fun toggleDarkMode(enabled: Boolean) {
viewModelScope.launch {
repo.saveDarkMode(enabled)
}
}
}Activity/Fragment में निरीक्षण करना
lifecycleScope.launch का उपयोग करके UI में StateFlow का संग्रह करें:
// In Fragment:
lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.isDarkMode.collect { darkMode ->
binding.switchDarkMode.isChecked = darkMode
AppCompatDelegate.setDefaultNightMode(
if (darkMode) AppCompatDelegate.MODE_NIGHT_YES
else AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
)
}
}
}त्रुटि प्रबंधन
यदि फ़ाइल खराब हो गई है, तो डेटास्टोर IOException जारी करता है। इसे अपने Flow पाइपलाइन में पकड़ें:
import kotlinx.coroutines.flow.catch
import java.io.IOException
val safeFlow: Flow<Boolean> = context.dataStore.data
.catch { exception ->
if (exception is IOException) {
emit(emptyPreferences()) // return defaults
} else {
throw exception
}
}
.map { prefs ->
prefs[PreferencesKeys.DARK_MODE] ?: false
}डेटास्टोर बनाम SharedPreferences
डेटास्टोर के बेहतर होने के कारणों का सारांश:
- डेटास्टोर बैकग्राउंड थ्रेड पर अपने-आप पढ़ता और लिखता है — ANR का जोखिम नहीं
- SharedPreferences का
apply()चुपचाप विफल हो सकता है; डेटास्टोर Flow के माध्यम से त्रुटियाँ प्रसारित करता है - डेटास्टोर प्रतिक्रियाशील है — डेटा बदलने पर UI अपने-आप अपडेट होता है
- SharedPreferences में माइग्रेशन का कोई मार्ग नहीं है; डेटास्टोर में अंतर्निहित
SharedPreferencesMigrationमौजूद है
त्वरित जाँच
डेटास्टोर अपने डेटा को ऐप के बाकी हिस्सों के लिए उपलब्ध कराने हेतु किस मुख्य तंत्र का उपयोग करता है?
पुनरावलोकन: डेटास्टोर Preferences
सरल डेटा को स्थायी रूप से रखने का आधुनिक तरीका डेटास्टोर है:
datastore-preferencesनिर्भरता जोड़ेंpreferencesDataStoreडेलीगेट के साथ एकल इंस्टेंस बनाएँstringPreferencesKey,booleanPreferencesKeyआदि से टाइप-सुरक्षित कुंजियाँ परिभाषित करें- किसी कॉरूटीन के अंदर
dataStore.edit { }से लिखें dataStore.data.map { }के साथFlowके रूप में पढ़ें.catch { emit(emptyPreferences()) }के साथIOExceptionको संभालें
अगला विषय: DiffUtil के साथ कुशल सूची अडैप्टर बनाएँ।
एआई शिक्षक के साथ Kotlin सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 36
- पाठ
- 152
अक्सर पूछे जाने वाले प्रश्न
क्या “DataStore प्राथमिकताएँ” पाठ निःशुल्क है?
हाँ — Android Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “DataStore प्राथमिकताएँ” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Android Academy पाठ्यक्रम में कुल 6 पाठ शामिल हैं।
“DataStore प्राथमिकताएँ” में मैं क्या सीखूँगा?
SharedPreferences को आधुनिक DataStore लाइब्रेरी से बदलें। डेटा को Kotlin Flow के रूप में पढ़ें, edit{} से लिखें और त्रुटियों को सुरक्षित रूप से संभालें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Android Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Android Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Android Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 6 में से 5वाँ पाठ है।
“DataStore प्राथमिकताएँ” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Android Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Android Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Kotlin कलेक्शन
- RecyclerView की मूल बातें
- RecyclerView क्लिक इवेंट
- SharedPreferences
- DataStore प्राथमिकताएँ
- अडैप्टर और DiffUtil