<पी> कुछ साल पहले, Google ने डेटास्टोर की घोषणा की, जो आजमाए हुए और सच्चे SharedPreferences का प्रतिस्थापन है। पी> <पी> यदि आप अपने अनुप्रयोगों में SharedPreferences का उपयोग करते हैं या कर चुके हैं, तो आप स्विच करने के बारे में सोच रहे होंगे। लेकिन हर चीज़ की तरह, यहां मुख्य प्रश्न यह है:विकास में लागत क्या होगी? <पी> डेटास्टोर का उपयोग करने के लाभ हैं, लेकिन केवल प्रोटो डेटास्टोर आपको प्रकार की सुरक्षा प्रदान करते हुए वस्तुओं को सहेजने की अनुमति देता है। पी> <पी> यदि आप प्रोटो डेटास्टोर के लिए दस्तावेज़ देखेंगे, तो आप पाएंगे कि यह थोड़ा पुराना है और इसके साथ काम करते समय कुछ महत्वपूर्ण चरण गायब हैं। इसीलिए, इस लेख में, हम आपके एप्लिकेशन में प्रोटो डेटास्टोर को कैसे एकीकृत करें और यह दिखाएंगे कि इसका उपयोग करना उतना बड़ा झंझट नहीं है। डेटास्टोर क्या है?
<पी> जेटपैक डेटास्टोर के दो प्रकार हैं: - प्राथमिकताएँ डेटास्टोर
- प्रोटो डेटास्टोर
<पी> हम पहले पर चर्चा नहीं करेंगे, क्योंकि यह SharedPreferences से समानता रखता है और इस तथ्य को भी व्यापक रूप से कवर किया गया है। तो अब आइए समझते हैं कि प्रोटो डेटास्टोर में प्रोटो का क्या मतलब है। <पी> प्रोटो वह नाम है जिसे Google ने प्रोटोकॉल बफ़र्स का प्रतिनिधित्व करने के लिए चुना है। ये (Google के) तंत्र हैं जो संरचित डेटा को क्रमबद्ध करने में आपकी सहायता करते हैं। वे भाषा-विशिष्ट कोडिंग नहीं कर रहे हैं और सामान्य तौर पर, आप उस डेटा के प्रकार को परिभाषित करते हैं जिसके साथ आप काम करना चाहते हैं और फिर कोड उत्पन्न होता है जो आपके डेटा को पढ़ने और लिखने में मदद करता है। <पी> ✋ हम इस लेख में प्रोटो 3 संस्करण का उपयोग करेंगे। <पी> वह परिभाषा कैसी दिखती है? message MyItem {
string itemName = 1;
int32 itemId = 2;
}
<पी> सबसे पहले, आप किसी ऑब्जेक्ट को message कीवर्ड से परिभाषित करते हैं। इसके अंदर, आप उस ऑब्जेक्ट से जुड़े फ़ील्ड को सूचीबद्ध करते हैं। प्रत्येक फ़ील्ड के अंत में संख्याओं का उपयोग फ़ील्ड की पहचान करने के लिए किया जाता है और एक बार सेट होने और ऑब्जेक्ट उपयोग में होने पर इसे बदला नहीं जा सकता है . <पी> लेकिन क्या होगा यदि हम अपनी .proto फ़ाइल में एकाधिक ऑब्जेक्ट रखना चाहें? यह मानते हुए कि वस्तुएं एक-दूसरे से संबंधित हैं, आप बस अधिक संदेश ऑब्जेक्ट जोड़कर ऐसा कर सकते हैं: message MyItem {
string itemName = 1;
int32 itemId = 2;
}
message MyListOfItems {
repeated MyItem items = 1;
}
<पी> ध्यान दें कि ऊपर हमने एक और संदेश ऑब्जेक्ट जोड़ा है जो ऊपर परिभाषित MyItem ऑब्जेक्ट पर निर्भर करता है। यदि आप वस्तुओं की सूची को परिभाषित करना चाहते हैं, तो आपको दोहराया गया का उपयोग करना होगा कीवर्ड. प्रोटो डेटास्टोर कैसे सेट करें
<पी> आरंभ करने के लिए, आपको अपने एप्लिकेशन स्तर बिल्ड.ग्रेडल में निम्नलिखित निर्भरताएँ जोड़नी होंगी: implementation "androidx.datastore:datastore-preferences:1.0.0"
implementation "com.google.protobuf:protobuf-javalite:3.18.0"
<पी> फिर, आपको अपने प्रोजेक्ट के अंदर एक प्रोटो डायरेक्टरी बनाने की आवश्यकता होगी। इस निर्देशिका को आपके प्रोजेक्ट संरचना में जावा फ़ोल्डर का सहोदर होना आवश्यक है। पी> <पी> प्रोटो निर्देशिका के अंदर, आप एक .proto फ़ाइल बना रहे होंगे। यह फ़ाइल उन डेटा प्रकारों को उत्पन्न करने के लिए ज़िम्मेदार है जिन्हें आप प्रोटो डेटास्टोर में संग्रहीत करना चाहते हैं। <पी>
<पी> प्रोटो निर्देशिका के अंदर, .proto एक्सटेंशन के साथ एक फ़ाइल बनाएं। हमारी .proto फ़ाइल में टोडो सूची (और क्या?) का प्रतिनिधित्व करने वाली वस्तुएं होंगी। तो हम अपनी फ़ाइल को todo.proto कहेंगे और यह इस तरह दिखेगा: syntax = "proto3";
option java_package = "com.yourPackageName.todo";
option java_multiple_files = true;
message TodoItem {
string itemId = 1;
string itemDescription = 2;
}
message TodoItems {
repeated TodoItem items = 1;
}
<पी> ध्यान दें कि हमने दो संदेश ऑब्जेक्ट को कैसे परिभाषित किया: - TodoItem - जो एक todo आइटम को परिभाषित करता है
- TodoItems - जो TodoItem ऑब्जेक्ट्स की एक सूची को परिभाषित करता है
<पी> इसके बाद, प्रोजेक्ट बनाएं ताकि TodoItem और TodoItems के लिए कक्षाएं तैयार की जा सकें। <पी> हमारे डेटा ऑब्जेक्ट को परिभाषित करने के बाद, हमें उन्हें क्रमबद्ध करने के लिए एक क्लास बनाने की आवश्यकता है। यह क्लास डेटास्टोर को बताएगी कि हमारी वस्तुओं को कैसे पढ़ा/लिखा जाए। // 1
object TodoItemSerializer: Serializer<TodoItems> {
// 2
override val defaultValue: TodoItems = TodoItems.getDefaultInstance()
// 3
override suspend fun readFrom(input: InputStream): TodoItems {
try {
return TodoItems.parseFrom(input)
} catch (exception: InvalidProtocolBufferException) {
throw CorruptionException("Cannot read proto.", exception)
}
}
// 3
override suspend fun writeTo(
t: TodoItems,
output: OutputStream
) = t.writeTo(output)
}
<पी> आइए समीक्षा करें कि इस कक्षा में हमारे पास क्या है: - जब हम क्लास घोषित करते हैं, तो हमें Serializer लागू करने की आवश्यकता होती है प्रकार (T)
के रूप में हमारे ऑब्जेक्ट के साथ इंटरफ़ेस - यदि फ़ाइल नहीं बनाई गई है तो हम सीरिएलाइज़र के लिए एक डिफ़ॉल्ट मान परिभाषित करते हैं
- हम readFrom/writeTo तरीकों को ओवरराइड करते हैं और यह सुनिश्चित करते हैं कि हमारा ऑब्जेक्ट वहां डेटा प्रकार के रूप में हो
<पी> हमारे पास हमारे डेटा प्रकारों और हमारे सीरिएलाइज़र के साथ हमारी .proto फ़ाइल है, इसलिए अगला कदम डेटास्टोर को इंस्टेंट करना है। हम डेटास्टोर द्वारा बनाए गए प्रॉपर्टी डेलिगेट का उपयोग करके ऐसा करते हैं, जिसके लिए एक फ़ाइल नाम देने की आवश्यकता होती है जहां हमारा डेटा सहेजा जाएगा और हमारा सीरियलाइज़र क्लास (जिसे हमने ऊपर परिभाषित किया है)। private const val DATA_STORE_FILE_NAME = "todo.pb"
private val Context.todoItemDatastore: DataStore<TodoItems> by dataStore(
fileName = DATA_STORE_FILE_NAME,
serializer = TodoItemSerializer,
)
<पी> कोड के इस टुकड़े को आपके द्वारा चुने गए वर्ग के शीर्ष पर वर्ग की परिभाषा के ऊपर स्थित होना चाहिए। वह है: private const val DATA_STORE_FILE_NAME = "todo.pb"
private val Context.todoItemDatastore: DataStore<TodoItems> by dataStore(
fileName = DATA_STORE_FILE_NAME,
serializer = TodoItemSerializer,
)
class YourClassName {
}
<पी> हमारे बाकी एप्लिकेशन में इस ऑब्जेक्ट तक पहुंचने के लिए, हमें एक संदर्भ का उपयोग करने की आवश्यकता होगी। एक उदाहरण आपके व्यूमॉडल क्लास में एप्लिकेशन संदर्भ का उपयोग करना है: class MyViewModel(application: Application): AndroidViewModel(application) {
val todoDataStore = application.todoItemDataStore
//...
}
कोटलिन फ्लो का उपयोग कैसे करें
<पी> अब जब हम अपने डेटास्टोर के लिए आवश्यक सभी चीजें स्थापित कर चुके हैं, तो हम चर्चा करेंगे कि हम वास्तव में इसके साथ कैसे बातचीत करेंगे। हम इसमें/से डेटा पढ़ना और लिखना चाहेंगे। लेकिन जिस तरह से हम ऐसा कर सकते हैं वह उस तरीके से भिन्न है जिससे आप SharedPreferences से परिचित हो सकते हैं। <पी> ऊपर हमने जिस डेटास्टोर को परिभाषित किया है, उसमें एक डेटा फ़ील्ड है जो हमारे डेटास्टोर में परिभाषित गुणों के लिए एक प्रवाह को उजागर करता है। <पी> 🚰 यदि आप प्रवाह से परिचित नहीं हैं, तो शुरुआत करने के लिए यह एक अच्छी जगह है। val todoItemFlow: Flow<TodoItems> = todoItemDataStore.data
.catch { exception ->
if (exception is IOException) {
emit(TodoItems.getDefaultInstance())
} else {
throw exception
}
}
<पी> उपरोक्त कोड दिखाता है कि आप एक फ़्लो को कैसे परिभाषित कर सकते हैं जो प्रोटो डेटास्टोर से डेटा एकत्र करता है। अपवाद होने की स्थिति में कैच ब्लॉक जोड़ा गया था। आप इस तर्क को उस कक्षा में रख सकते हैं जहां आपने अपना डेटास्टोर परिभाषित किया है और इसे अपने व्यूमॉडल में उपयोग कर सकते हैं: val todoItemsFlow: LiveData<TodoItems> = todoItemsRepository.todoItemFlow.asLiveData()
<पी> ध्यान दें कि हमने अपने फ़्लो को लाइवडेटा में कैसे परिवर्तित किया। हमने ऐसा दो कारणों से किया: - प्रवाह सक्रिय रह सकता है, भले ही उनका उपयोग करने वाली गतिविधि/खंड कुछ भी हो
- लाइवडेटा कई डेवलपर्स के लिए परिचित है, और मैं इस उदाहरण को यथासंभव सुलभ बनाना चाहता था
<पी> ऐसा करने में सक्षम होने के लिए, आपको अपनी बिल्ड.ग्रेडल फ़ाइल में निम्नलिखित निर्भरता जोड़ने की आवश्यकता है: implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.2"
<पी> अपनी गतिविधि/खंड कक्षा में, आप इस लाइव डेटा को इस प्रकार देख सकते हैं: myViewModel.todoItemFlow.observe(LocalLifecycleOwner.current) { todoItems ->
// Logic to access data from DataStore
}
डेटास्टोर का उपयोग क्यों और कब करें
<पी> हमने जो कुछ भी समीक्षा की उसके बाद, कमरे में हाथी के बारे में बात करने का समय आ गया है। क्या आपको आगे बढ़ना चाहिए और अपने मौजूदा या अगले प्रोजेक्ट में डेटास्टोर (या तो प्राथमिकताएं या प्रोटो) का उपयोग करना चाहिए? <पी> मेरी राय में, उत्तर हाँ होना चाहिए . इस तथ्य के अलावा कि Google SharedPreferences से दूर जा रहा है, डेटास्टोर आपके एप्लिकेशन पर ध्यान केंद्रित करने में मदद करने के लिए बहुत सारे लाभ प्रदान करता है, न कि आपके डेटा की दृढ़ता पर। पी> <पी> यूआई थ्रेड से डेटास्टोर के साथ इंटरैक्ट करना सुरक्षित है (क्योंकि यह काम को स्वचालित रूप से I/O में ले जाता है), और यह आपको फ़्लो का उपयोग करने के लिए बाध्य करता है (यदि आपने अभी तक नहीं किया है) और इसके भीतर सभी लाभों का आनंद लें। SharedPreferences से Preferences DataStore पर आसानी से माइग्रेट करने का विकल्प भी है। <पी> यदि आप प्रोटो डेटास्टोर के बजाय रूम का उपयोग करने पर विचार कर रहे हैं, तो यह आपके उपयोग के मामले पर निर्भर करता है। यदि आप जिस डेटा को सहेजने जा रहे हैं (या बनाए रखना चाहते हैं) वह छोटी है और उसे आंशिक रूप से अपडेट करने की आवश्यकता नहीं है, तो प्रोटो डेटास्टोर ही रास्ता है। यदि आपके पास बड़ा डेटा सेट है या जो जटिल हो सकता है, तो आपको इसके बजाय रूम का उपयोग करने का विकल्प चुनना चाहिए। <पी> यदि आप यह देखना चाहते हैं कि यह सभी कोड किसी एप्लिकेशन में कैसा दिखता है, तो आप इसे यहां देख सकते हैं: <पी> यदि आप मेरे द्वारा लिखे गए अन्य लेख पढ़ना चाहते हैं, तो आप उन्हें यहां देख सकते हैं: <पी> पढ़ने के लिए धन्यवाद! <पी> सन्दर्भ: - प्रोटोकॉल बफ़र्स दस्तावेज़ीकरण (प्रोटो 3)
- प्रोटो डेटास्टोर कोडेलैब के साथ काम करना
- डेटास्टोर दस्तावेज़ीकरण
<पी> मुफ़्त में कोड करना सीखें. फ्रीकोडकैंप के ओपन सोर्स पाठ्यक्रम ने 40,000 से अधिक लोगों को डेवलपर्स के रूप में नौकरी पाने में मदद की है। आरंभ करें