Firebase SQL Connect क्लाइंट SDK टूल की मदद से, सर्वर-साइड क्वेरी और म्यूटेशन को सीधे Firebase ऐप्लिकेशन से कॉल किया जा सकता है. सेवा पर डिप्लॉय किए जाने वाले स्कीमा, क्वेरी, और म्यूटेशन डिज़ाइन करते समय, कस्टम क्लाइंट SDK टूल जनरेट किया जाता है. SQL Connect इसके बाद, इस SDK टूल के तरीकों को अपनी क्लाइंट लॉजिक में इंटिग्रेट किया जाता है.
जैसा कि हमने कहीं और बताया है, यह ध्यान रखना ज़रूरी है कि SQL Connect क्वेरी और म्यूटेशन, क्लाइंट कोड से सबमिट नहीं किए जाते. इन्हें सर्वर पर एक्ज़ीक्यूट किया जाता है. इसके बजाय, डिप्लॉय किए जाने पर, SQL Connect ऑपरेशन सर्वर पर Cloud Functions की तरह सेव किए जाते हैं. इसका मतलब है कि आपको क्लाइंट-साइड में किए गए बदलावों को डिप्लॉय करना होगा, ताकि मौजूदा उपयोगकर्ताओं के लिए ऐप्लिकेशन काम करता रहे. उदाहरण के लिए, ऐप्लिकेशन के पुराने वर्शन पर.
इसलिए, SQL Connect आपको डेवलपर एनवायरमेंट और टूलिंग उपलब्ध कराता है. इसकी मदद से, सर्वर पर डिप्लॉय किए गए स्कीमा, क्वेरी, और म्यूटेशन का प्रोटोटाइप बनाया जा सकता है. प्रोटोटाइप बनाते समय, यह क्लाइंट-साइड SDK टूल अपने-आप जनरेट करता है.
जब आपकी सेवा और क्लाइंट ऐप्लिकेशन में किए गए अपडेट को दोहराया जाता है, तब सर्वर और क्लाइंट-साइड, दोनों के अपडेट डिप्लॉय किए जा सकते हैं.
क्लाइंट डेवलपमेंट का वर्कफ़्लो क्या है?
शुरू करने के लिए लेख में, आपको SQL Connect के लिए डेवलपमेंट के पूरे फ़्लो के बारे में बताया गया था. इस गाइड में, आपको अपने स्कीमा से Flutter SDK टूल जनरेट करने और क्लाइंट क्वेरी और म्यूटेशन के साथ काम करने के बारे में ज़्यादा जानकारी मिलेगी.
संक्षेप में, जनरेट किए गए Flutter SDK टूल को अपने क्लाइंट ऐप्लिकेशन में इस्तेमाल करने के लिए, आपको ये ज़रूरी शर्तें पूरी करनी होंगी:
- अपने Flutter ऐप्लिकेशन में Firebase जोड़ें.
- flutterfire CLI
dart pub global activate flutterfire_cliइंस्टॉल करें. flutterfire configureचलाएं.
इसके बाद:
- अपने ऐप्लिकेशन का स्कीमा डेवलप करें.
SDK टूल जनरेट करने की सुविधा सेट अप करें:
- हमारे SQL Connect VS Code एक्सटेंशन में मौजूद, ऐप्लिकेशन में SDK टूल जोड़ें बटन की मदद से
- अपडेट करके
connector.yaml.
सेट अप करें और SQL Connect एम्युलेटर का इस्तेमाल करें. साथ ही, इसे दोहराएं.
अपना Flutter SDK टूल जनरेट करना
अपने ऐप्लिकेशन में, SQL Connect से जनरेट किए गए SDK टूल सेट अप करने के लिए, Firebase का इस्तेमाल करें.
init कमांड को मौजूदा फ़ोल्डर में मौजूद सभी ऐप्लिकेशन का पता लगाना चाहिए और जनरेट किए गए SDK टूल को अपने-आप इंस्टॉल करना चाहिए.
firebase init dataconnect:sdk
प्रोटोटाइप बनाते समय, SDK टूल अपडेट करना
अगर आपने SQL Connect VS Code एक्सटेंशन इंस्टॉल किया है, तो यह जनरेट किए गए SDK टूल को हमेशा अप-टू-डेट रखेगा.
अगर SQL Connect VS Code एक्सटेंशन का इस्तेमाल नहीं किया जाता है, तो जनरेट किए गए SDK टूल को अप-टू-डेट रखने के लिए, Firebase CLI का इस्तेमाल किया जा सकता है.
firebase dataconnect:sdk:generate --watchबिल्ड पाइपलाइन में SDK टूल जनरेट करना
CI/CD बिल्ड प्रोसेस में, SQL Connect SDK टूल जनरेट करने के लिए, Firebase CLI का इस्तेमाल किया जा सकता है.
firebase dataconnect:sdk:generateक्लाइंट कोड सेट अप करना
अपना SQL Connect ऐप्लिकेशन शुरू करना
सबसे पहले, Firebase के सेटअप के स्टैंडर्ड निर्देशोंका इस्तेमाल करके, अपना ऐप्लिकेशन शुरू करें.
इसके बाद, SQL Connect प्लगिन इंस्टॉल करें:
flutter pub add firebase_data_connectSQL Connect Flutter SDK टूल शुरू करना
SQL Connect इंस्टेंस को सेट अप करने के लिए इस्तेमाल की गई जानकारी का इस्तेमाल करके, अपना SQL Connect इंस्टेंस शुरू करें. यह जानकारी, डेटाबेस और स्टोरेज > SQL Connect पेज Firebase कंसोल पर मिलेगी.
लाइब्रेरी इंपोर्ट करना
अपने क्लाइंट कोड को शुरू करने के लिए, इंपोर्ट के दो सेट की ज़रूरत होती है. पहला, सामान्य SQL Connect इंपोर्ट और दूसरा, जनरेट किए गए SDK टूल के खास इंपोर्ट.
// general imports
import 'package:firebase_data_connect/firebase_data_connect.dart';
// generated queries and mutations from SDK
import 'generated/movies.dart';
क्लाइंट साइड पर क्वेरी का इस्तेमाल करना
जनरेट किए गए कोड में, पहले से तय किए गए क्वेरी रेफ़रंस मौजूद होंगे. आपको बस इन्हें इंपोर्ट करना होगा और इन पर execute को कॉल करना होगा.
import 'generated/movies.dart';
await MoviesConnector.instance.listMovies().execute();
SDK टूल की क्वेरी के तरीके कॉल करना
यहां इन ऐक्शन शॉर्टकट फ़ंक्शन का इस्तेमाल करने का एक उदाहरण दिया गया है:
import 'generated/movies.dart';
function onBtnClick() {
// This will call the generated Dart from the CLI and then make an HTTP request to the server.
MoviesConnector.instance.listMovies().execute().then(data => showInUI(data)); // == MoviesConnector.instance.listMovies().ref().execute();
}
वैकल्पिक फ़ील्ड
कुछ क्वेरी में, वैकल्पिक फ़ील्ड हो सकते हैं. ऐसे मामलों में, Flutter SDK टूल एक बिल्डर तरीका दिखाता है. इसे अलग से सेट करना होगा.
उदाहरण के लिए, createMovie को कॉल करते समय, rating फ़ील्ड वैकल्पिक होता है. इसलिए, आपको इसे बिल्डर फ़ंक्शन में देना होगा.
await MoviesConnector.instance.createMovie( title: 'Empire Strikes Back', releaseYear: 1980, genre: 'Sci-Fi').rating(5).execute();
बदलावों की सदस्यता लेना
से रीयल-टाइम अपडेट पाने का तरीका लेख पढ़ें.SQL Connect
गिनती वाले फ़ील्ड में होने वाले बदलावों को मैनेज करना
किसी ऐप्लिकेशन के स्कीमा में गिनती वाले फ़ील्ड हो सकते हैं, जिन्हें आपकी GraphQL क्वेरी से ऐक्सेस किया जा सकता है.
ऐप्लिकेशन के डिज़ाइन में बदलाव होने पर, गिनती वाले फ़ील्ड में नई वैल्यू जोड़ी जा सकती हैं. उदाहरण के लिए, मान लें कि ऐप्लिकेशन के लाइफ़साइकल में बाद में, आपने AspectRatio गिनती वाले फ़ील्ड में FULLSCREEN वैल्यू जोड़ने का फ़ैसला किया.
SQL Connect वर्कफ़्लो में, क्वेरी और SDK टूल अपडेट करने के लिए, लोकल डेवलपमेंट टूलिंग का इस्तेमाल किया जा सकता है.
हालांकि, अपने क्लाइंट का अपडेट किया गया वर्शन रिलीज़ करने से पहले, डिप्लॉय किए गए पुराने क्लाइंट काम करना बंद कर सकते हैं.
लचीले तरीके से लागू करने का उदाहरण
जनरेट किया गया SDK टूल, अज्ञात वैल्यू को मैनेज करने के लिए मजबूर करता है. इसका मतलब है कि क्लाइंट कोड को EnumValue ऑब्जेक्ट को Known या Unknown में अनरैप करना होगा.
final result = await MoviesConnector.instance.listMovies().execute();
if (result.data != null && result.data!.isNotEmpty) {
handleEnumValue(result.data![0].aspectratio);
}
void handleEnumValue(EnumValue<AspectRatio> aspectValue) {
if (aspectValue.value != null) {
switch(aspectValue.value!) {
case AspectRatio.ACADEMY:
print('This movie is in Academy aspect');
break;
case AspectRatio.WIDESCREEN:
print('This movie is in Widescreen aspect');
break;
case AspectRatio.ANAMORPHIC:
print('This movie is in Anamorphic aspect');
break;
case AspectRatio.IMAX:
print('This movie is in IMAX aspect');
}
} else {
print('Unknown aspect ratio detected: ${aspectValue.stringValue}');
}
}
क्लाइंट-साइड कैशिंग की सुविधा चालू करना
SQL Connect में, क्लाइंट-साइड कैशिंग की सुविधा उपलब्ध है. इसे चालू करने के लिए, आप connector.yaml फ़ाइल में बदलाव कर सकते हैं. इस सुविधा के चालू होने पर, जनरेट किए गए क्लाइंट SDK टूल, क्वेरी के जवाबों को स्थानीय तौर पर कैश करेंगे. इससे आपके ऐप्लिकेशन के डेटाबेस के अनुरोधों की संख्या कम हो सकती है. साथ ही, नेटवर्क की उपलब्धता में रुकावट आने पर भी, आपके ऐप्लिकेशन के डेटाबेस पर निर्भर हिस्से काम कर सकते हैं.
क्लाइंट-साइड कैशिंग की सुविधा चालू करने के लिए, अपने कनेक्टर कॉन्फ़िगरेशन में क्लाइंट कैशिंग कॉन्फ़िगरेशन जोड़ें:
generate:
javascriptSdk:
outputDir: ../dart/
package: "dataconnect_generated"
clientCache:
maxAge: 5s
storage: memory
इस कॉन्फ़िगरेशन में दो पैरामीटर होते हैं. दोनों वैकल्पिक हैं:
maxAge: कैश किए गए जवाब की ज़्यादा से ज़्यादा उम्र. इसके बाद, क्लाइंट SDK टूल नई वैल्यू फ़ेच करेगा. उदाहरण: "0", "30s", "1h30m".maxAgeकी डिफ़ॉल्ट वैल्यू0होती है. इसका मतलब है कि जवाब कैश किए जाते हैं, लेकिन क्लाइंट SDK टूल हमेशा नई वैल्यू फ़ेच करेगा. कैश की गई वैल्यू का इस्तेमाल सिर्फ़ तब किया जाएगा, जबexecute()औरsubscribe()से मिले शुरुआती नतीजे के लिए,CACHE_ONLYतय किया गया हो.storage: क्लाइंट SDK टूल कोpersistentस्टोरेज याmemoryमें जवाब कैश करने के लिए कॉन्फ़िगर किया जा सकता है.persistentस्टोरेज में कैश किए गए नतीजे, ऐप्लिकेशन को रीस्टार्ट करने पर भी बने रहेंगे. Android या iOS को टारगेट करते समय, डिफ़ॉल्ट रूप सेpersistentस्टोरेज का इस्तेमाल किया जाता है. वेब ब्राउज़र को टारगेट करते समय, सिर्फ़memoryस्टोरेज का इस्तेमाल किया जा सकता है.
अपने कनेक्टर के कैशिंग कॉन्फ़िगरेशन को अपडेट करने के बाद, अपने क्लाइंट SDK टूल को फिर से जनरेट करें और अपने ऐप्लिकेशन को फिर से बनाएं. ऐसा करने के बाद, execute() और subscribe(), जवाबों को कैश करेंगे और आपके कॉन्फ़िगर की गई नीति के मुताबिक, कैश की गई वैल्यू का इस्तेमाल करेंगे. आम तौर पर, यह प्रोसेस अपने-आप होती है. इसके लिए, आपको कोई और कार्रवाई नहीं करनी पड़ती. हालांकि, इन बातों का ध्यान रखें:
execute()का डिफ़ॉल्ट व्यवहार ऊपर बताया गया है: अगर किसी क्वेरी के लिए कोई नतीजा कैश किया जाता है और कैश की गई वैल्यू,maxAgeसे पुरानी नहीं है, तो कैश की गई वैल्यू का इस्तेमाल करें. इस डिफ़ॉल्ट व्यवहार कोPREFER_CACHEनीति कहा जाता है.execute()के अलग-अलग कॉल के लिए, यह भी तय किया जा सकता है कि सिर्फ़ कैश की गई वैल्यू (CACHE_ONLY) दिखाई जाएं या सर्वर से बिना शर्त नई वैल्यू फ़ेच की जाएं (SERVER_ONLY).await queryRef.execute(fetchPolicy: QueryFetchPolicy.cacheOnly);await queryRef.execute(fetchPolicy: QueryFetchPolicy.serverOnly);subscribe()को कॉल करने पर, अगर कैश किया गया कॉन्टेंट मौजूद है, तो यहmaxAgeसेटिंग के बावजूद, हमेशा तुरंत कैश किया गया कॉन्टेंट दिखाएगा.execute()के बाद के कॉल, कॉन्फ़िगर किए गएmaxAgeके मुताबिक, लिसनर को सूचनाएं भेजेंगे.
क्लाइंट साइड पर म्यूटेशन का इस्तेमाल करना
म्यूटेशन को क्वेरी की तरह ही ऐक्सेस किया जा सकता है.
await MoviesConnector.instance.createMovie({ title: 'Empire Strikes Back', releaseYear: 1980, genre: "Sci-Fi" }).rating(5).execute();
अपने Flutter ऐप्लिकेशन का प्रोटोटाइप बनाना और उन्हें टेस्ट करना
स्थानीय एम्युलेटर का इस्तेमाल करने के लिए, क्लाइंट को इंस्ट्रूमेंट करना
आप SQL Connect एम्युलेटर का इस्तेमाल, SQL Connect VS Code एक्सटेंशन या CLI से कर सकते हैं.
दोनों ही स्थितियों में, ऐप्लिकेशन को एम्युलेटर से कनेक्ट करने के लिए इंस्ट्रूमेंट करने का तरीका एक ही है.
import 'package:firebase_data_connect/firebase_data_connect.dart';
import 'generated/movies.dart';
MoviesConnector.instance.dataConnect
.useDataConnectEmulator('127.0.0.1', 9399);
// Make calls from your app
QueryRef<ListMoviesData, void> ref = MoviesConnector.instance.listMovies.ref();
प्रॉडक्शन रिसॉर्स पर स्विच करने के लिए, एम्युलेटर से कनेक्ट करने वाली लाइनों को टिप्पणी के तौर पर मार्क करें.
Dart SDK टूल में डेटा टाइप
SQL Connect सर्वर, GraphQL के सामान्य डेटा टाइप दिखाता है. इन्हें SDK टूल में इस तरह दिखाया जाता है.
| SQL Connect टाइप | Dart |
|---|---|
| टाइमस्टैम्प | firebase_data_connect.Timestamp |
| इंट (32-बिट) | int |
| तारीख | DateTime |
| यूयूआईडी | string |
| Int64 | int |
| फ़्लोट | double |
| बूलियन | bool |
| कोई भी | firebase_data_connect.AnyValue |