Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रणाली >> Android

Android Proto DataStore: क्या SharedPreferences से स्विच करना उचित है?

कुछ साल पहले, Google ने DataStore की घोषणा की, जो आजमाए हुए और सच्चे SharedPreferences का प्रतिस्थापन है।

यदि आप अपने एप्लिकेशन में SharedPreferences का उपयोग करते हैं या कर चुके हैं, तो आप स्विच करने के बारे में सोच रहे होंगे। लेकिन हर चीज की तरह, यहां मुख्य सवाल है: विकास में लागत क्या होने वाली है?

DataStore का उपयोग करने के लाभ हैं, लेकिन केवल Proto DataStore ही आपको ऑब्जेक्ट्स को सहेजने की अनुमति देता है जबकि टाइप सेफ्टी प्रदान करता है।

यदि आप Proto DataStore के लिए दस्तावेज़ीकरण देखते हैं, तो आप पाएंगे कि यह थोड़ा पुराना है और इसके साथ काम करते समय कुछ महत्वपूर्ण चरण गायब हैं। इसलिए, इस लेख में, हम आपके एप्लिकेशन में Proto DataStore को एकीकृत करने के तरीके पर जाने जा रहे हैं और दिखाएंगे कि इसका उपयोग करना इतना बड़ा झंझट नहीं है।

DataStore क्या है?

Jetpack DataStore के दो वेरिएंट हैं:

  • Preferences DataStore
  • Proto DataStore

हम पहले पर चर्चा नहीं करेंगे, क्योंकि यह SharedPreferences के समान है और यह तथ्य भी कि इसे व्यापक रूप से कवर किया गया है। तो अब आइए समझते हैं कि Proto DataStore में Proto का क्या अर्थ है।

Proto, Google द्वारा प्रोटोकॉल बफर्स को दर्शाने के लिए चुना गया नाम है। ये (Google के) तंत्र हैं जो आपको संरचित डेटा को क्रमबद्ध करने में मदद करते हैं। वे कोडिंग भाषा-विशिष्ट नहीं हैं और सामान्य तौर पर, आप उस डेटा के प्रकार को परिभाषित करते हैं जिसके साथ आप काम करना चाहते हैं और फिर कोड उत्पन्न होता है जो आपको अपना डेटा पढ़ने और लिखने में मदद करता है।

✋ हम इस लेख में Proto 3 संस्करण का उपयोग करेंगे।

वह परिभाषा कैसी दिखती है?

message MyItem { string itemName = 1; int32 itemId = 2; } 

सबसे पहले, आप message कीवर्ड के साथ एक ऑब्जेक्ट परिभाषित करते हैं। इसके अंदर, आप उस ऑब्जेक्ट से जुड़े फील्ड्स को सूचीबद्ध करते हैं। प्रत्येक फील्ड के अंत में नंबरों का उपयोग फील्ड की पहचान करने के लिए किया जाता है और एक बार सेट होने और ऑब्जेक्ट के उपयोग में होने के बाद इन्हें बदला नहीं जा सकता।

लेकिन क्या होगा यदि हम अपने .proto फाइल में कई ऑब्जेक्ट रखना चाहते हैं? यह मानते हुए कि ऑब्जेक्ट एक-दूसरे से संबंधित हैं, आप बस और message ऑब्जेक्ट जोड़कर ऐसा कर सकते हैं:

message MyItem { string itemName = 1; int32 itemId = 2; } message MyListOfItems { repeated MyItem items = 1; } 

ध्यान दें कि ऊपर हमने एक और message ऑब्जेक्ट जोड़ा है जो ऊपर परिभाषित MyItem ऑब्जेक्ट पर निर्भर करता है। यदि आप ऑब्जेक्ट्स की एक सूची परिभाषित करना चाहते हैं, तो आपको repeated कीवर्ड का उपयोग करना होगा।

Proto DataStore कैसे सेट करें

शुरू करने के लिए, आपको अपने एप्लिकेशन लेवल build.gradle में निम्नलिखित डिपेंडेंसी जोड़ने की आवश्यकता होगी:

 implementation "androidx.datastore:datastore-preferences:1.0.0" implementation "com.google.protobuf:protobuf-javalite:3.18.0" 

फिर, आपको अपने प्रोजेक्ट के अंदर एक proto डायरेक्टरी बनाने की आवश्यकता होगी। यह डायरेक्टरी आपकी प्रोजेक्ट संरचना में Java फोल्डर का सहोदर होना चाहिए।

proto डायरेक्टरी के अंदर, आप एक .proto फाइल बनाएंगे। यह फाइल उन डेटा प्रकारों को उत्पन्न करने के लिए जिम्मेदार है जिन्हें आप Proto DataStore में स्टोर करना चाहते हैं।

Android Proto DataStore: क्या SharedPreferences से स्विच करना उचित है?

proto डायरेक्टरी के अंदर, .proto एक्सटेंशन वाली एक फाइल बनाएं। हमारी .proto फाइल एक Todo सूची का प्रतिनिधित्व करने वाले ऑब्जेक्ट्स को रखेगी (और क्या?)। तो हम अपनी फाइल को 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; } 

ध्यान दें कि हमने दो message ऑब्जेक्ट परिभाषित किए हैं:

  1. TodoItem - जो एक todo आइटम को परिभाषित करता है
  2. TodoItems - जो TodoItem ऑब्जेक्ट्स की एक सूची को परिभाषित करता है

अगला, प्रोजेक्ट को बिल्ड करें ताकि TodoItem और TodoItems के लिए क्लासेस उत्पन्न हों।

हमारे डेटा ऑब्जेक्ट्स परिभाषित हो जाने के बाद, हमें उन्हें क्रमबद्ध करने के लिए एक क्लास बनाने की आवश्यकता है। यह क्लास DataStore को बताएगी कि हमारे ऑब्जेक्ट्स को कैसे पढ़ना/लिखना है।

// 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) } 

आइए समीक्षा करें कि इस क्लास में हमारे पास क्या है:

  1. जब हम क्लास घोषित करते हैं, तो हमें अपने ऑब्जेक्ट को प्रकार (T) के रूप में Serializer इंटरफेस को लागू करने की आवश्यकता होती है
  2. हम सीरियलाइज़र के लिए एक डिफ़ॉल्ट मान परिभाषित करते हैं यदि फाइल नहीं बनाई गई है
  3. हम readFrom/writeTo मेथड्स को ओवरराइड करते हैं और हम सुनिश्चित करते हैं कि वहां हमारे ऑब्जेक्ट को डेटा प्रकार के रूप में रखा जाए

हमारे पास हमारी .proto फाइल है जिसमें हमारे डेटा प्रकार हैं और हमारा सीरियलाइज़र है, इसलिए अगला चरण DataStore को इंस्टेंटिएट करना है। हम इसे dataStore द्वारा बनाए गए प्रॉपर्टी डेलीगेट का उपयोग करके करते हैं, जिसमें उस फाइलनाम की आवश्यकता होती है जहां हमारा डेटा सहेजा जाएगा और हमारा सीरियलाइज़र क्लास (जिसे हमने ऊपर परिभाषित किया है)।

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 //... } 

Kotlin Flow का उपयोग कैसे करें

अब जब हम अपने DataStore के लिए आवश्यक सब कुछ सेट करने से गुजर चुके हैं, तो हम चर्चा करेंगे कि हम वास्तव में इसके साथ कैसे इंटरैक्ट करने जा रहे हैं। हम इससे डेटा पढ़ना और लिखना चाहेंगे। लेकिन हम ऐसा करने का तरीका उससे अलग है जिससे आप SharedPreferences से परिचित हो सकते हैं।

हमने ऊपर जो DataStore परिभाषित किया है, उसमें एक डेटा फील्ड है जो हमारे DataStore में परिभाषित प्रॉपर्टीज के लिए एक Flow उजागर करता है।

🚰 यदि आप फ्लो से परिचित नहीं हैं, तो यह शुरू करने के लिए एक अच्छी जगह है।

val todoItemFlow: Flow<TodoItems> = todoItemDataStore.data .catch { exception -> if (exception is IOException) { emit(TodoItems.getDefaultInstance()) } else { throw exception } } 

उपरोक्त कोड दिखाता है कि आप Proto DataStore से डेटा एकत्र करने वाले Flow को कैसे परिभाषित कर सकते हैं। एक कैच ब्लॉक जोड़ा गया था ताकि यदि कोई अपवाद होता है। आप इस लॉजिक को उस क्लास में रख सकते हैं जहां आपने अपना DataStore परिभाषित किया था और इसे अपने व्यूमॉडल में इस तरह उपयोग कर सकते हैं:

val todoItemsFlow: LiveData<TodoItems> = todoItemsRepository.todoItemFlow.asLiveData() 

ध्यान दें कि हमने अपने Flow को LiveData में बदल दिया। हमने ऐसा दो कारणों से किया:

  1. फ्लो उस एक्टिविटी/फ्रैगमेंट की परवाह किए बिना सक्रिय रह सकते हैं जो उनका उपयोग करते हैं
  2. LiveData कई डेवलपर्स के लिए परिचित है, और मैं इस उदाहरण को यथासंभव सुलभ बनाना चाहता था

ऐसा करने में सक्षम होने के लिए, आपको अपने build.gradle फाइल में निम्नलिखित डिपेंडेंसी जोड़ने की आवश्यकता है:

implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.2" 

अपनी एक्टिविटी/फ्रैगमेंट क्लास में, आप इस लाइव डेटा को इस तरह देख सकते हैं:

myViewModel.todoItemFlow.observe(LocalLifecycleOwner.current) { todoItems -> // DataStore से डेटा एक्सेस करने का लॉजिक } 

DataStore का उपयोग क्यों और कब करें

हमने जो कुछ भी समीक्षा किया, उसके बाद, कमरे में हाथी के बारे में बात करने का समय आ गया है। क्या आपको अपने मौजूदा या अगले प्रोजेक्ट में DataStore (चाहे Preferences या Proto) का उपयोग करना चाहिए?

मेरी राय में, उत्तर हाँ होना चाहिए। इस तथ्य के अलावा कि Google SharedPreferences से दूर जा रहा है, DataStore आपके डेटा की पर्सिस्टेंस पर नहीं बल्कि आपके एप्लिकेशन पर ध्यान केंद्रित करने में आपकी मदद करने के लिए बहुत सारे लाभ प्रदान करता है।

UI थ्रेड से DataStore के साथ इंटरैक्ट करना सुरक्षित है (क्योंकि यह काम को स्वचालित रूप से I/O पर ले जाता है), और यह आपको Flow का उपयोग करने के लिए मजबूर करता है (यदि आपने अभी तक नहीं किया है) और इसके भीतर सभी लाभों का आनंद लें। SharedPreferences से Preferences DataStore में आसानी से माइग्रेट करने का विकल्प भी है।

यदि आप Proto DataStore के बजाय Room का उपयोग करने पर विचार कर रहे हैं, तो ठीक है यह आपके उपयोग के मामले पर निर्भर करता है। यदि आप जिस डेटा को सहेजना (या स्थायी करना) चाहते हैं उसकी मात्रा काफी छोटी है और आंशिक अपडेट की आवश्यकता नहीं होगी, तो Proto DataStore जाने का रास्ता है। यदि आपके पास एक बड़ा डेटा सेट है या वह जटिल हो सकता है, तो आपको Room का उपयोग करने का विकल्प चुनना चाहिए।

यदि आप देखना चाहते हैं कि यह सारा कोड एप्लिकेशन में कैसा दिखता है, तो आप इसे यहां देख सकते हैं:

यदि आप मेरे द्वारा लिखे गए अन्य लेख पढ़ना चाहते हैं, तो आप उन्हें यहां देख सकते हैं:

पढ़ने के लिए धन्यवाद!

संदर्भ:

  • Protocol Buffers Documentation (proto 3)
  • Working With Proto DataStore Codelab
  • DataStore Documentation

मुफ्त में कोड करना सीखें। freeCodeCamp का ओपन सोर्स पाठ्यक्रम 40,000 से अधिक लोगों को डेवलपर्स के रूप में नौकरी पाने में मदद कर चुका है। शुरू करें

  1. विंडोज 11/10 में ShellExperienceHost.exe (विंडोज शेल एक्सपीरियंस होस्ट) क्या है विंडोज 11/10 में ShellExperienceHost.exe (विंडोज शेल एक्सपीरियंस होस्ट) क्या है

    ShellExperienceHost.exe विंडोज 11 या विंडोज 10 में क्या है? आपने इस प्रक्रिया को अपने टास्क मैनेजर में देखा होगा, और शायद कभी-कभी उच्च CPU या संसाधनों का उपभोग करते हुए। यह प्रक्रिया विंडोज शेल एक्सपीरियंस होस्ट है और यह माइक्रोसॉफ्ट विंडोज ऑपरेटिंग सिस्टम का एक हिस्सा है। ShellExperienceHost.exe क

  1. विंडोज 11/10 में तस्वीरों की कॉन्टैक्ट शीट कैसे बनाएं और प्रिंट करें विंडोज 11/10 में तस्वीरों की कॉन्टैक्ट शीट कैसे बनाएं और प्रिंट करें

    यहां विंडोज 11/10 के नेटिव प्रिंट फंक्शन का उपयोग करके कई छवियों से कॉन्टैक्ट शीट बनाने का ट्यूटोरियल दिया गया है। एक कॉन्टैक्ट शीट मूल रूप से एक ग्राफिक होता है जिसमें क्रम में कई छवियों के थंबनेल होते हैं। इसका उपयोग फोटोशूट, नेगेटिव से तस्वीरें दिखाने या केवल कुछ छवियों को एक शीट में प्रदर्शित कर

  1. सहज विंडोज 10 डाउनग्रेड: विंडोज 8.1 या 7 पर कैसे लौटें सहज विंडोज 10 डाउनग्रेड: विंडोज 8.1 या 7 पर कैसे लौटें

    विंडोज 10 से खुश नहीं हैं और अपने विंडोज ऑपरेटिंग सिस्टम के पिछले संस्करण पर वापस जाने की सोच रहे हैं, जैसे विंडोज 8.1 या 7? माइक्रोसॉफ्ट एक अंतर्निहित सुविधा प्रदान करता है जिसका उपयोग करके आप नए विंडोज 10 संस्करण को पुराने 8.1 या 7 पर डाउनग्रेड कर सकते हैं और इसे पुनर्स्थापित कर सकते हैं। यह सुविध