जनरेट किए गए Android SDK टूल इस्तेमाल करना

Firebase SQL Connect क्लाइंट SDK टूल की मदद से, सर्वर-साइड क्वेरी और म्यूटेशन को सीधे Firebase ऐप्लिकेशन से कॉल किया जा सकता है. सेवा में डिप्लॉय किए जाने वाले स्कीमा, क्वेरी, और म्यूटेशन डिज़ाइन करते समय, कस्टम क्लाइंट SDK टूल जनरेट किया जाता है. SQL Connect इसके बाद, इस SDK टूल के तरीकों को अपने क्लाइंट लॉजिक में इंटिग्रेट किया जाता है.

जैसा कि हमने कहीं और बताया है, यह ध्यान रखना ज़रूरी है कि SQL Connect क्वेरी और म्यूटेशन, क्लाइंट कोड से सबमिट नहीं किए जाते. साथ ही, इन्हें सर्वर पर एक्ज़ीक्यूट नहीं किया जाता. इसके बजाय, डिप्लॉय किए जाने पर, SQL Connect ऑपरेशन सर्वर पर सेव किए जाते हैं. जैसे, Cloud Functions. इसका मतलब है कि आपको मौजूदा उपयोगकर्ताओं के लिए, क्लाइंट-साइड में किए गए बदलावों को डिप्लॉय करना होगा. ऐसा न करने पर, मौजूदा उपयोगकर्ताओं के लिए ऐप्लिकेशन काम नहीं करेगा. उदाहरण के लिए, ऐप्लिकेशन के पुराने वर्शन पर.

इसलिए, SQL Connect आपको डेवलपर एनवायरमेंट और टूलिंग उपलब्ध कराता है. इसकी मदद से, सर्वर पर डिप्लॉय किए गए स्कीमा, क्वेरी, और म्यूटेशन का प्रोटोटाइप बनाया जा सकता है. प्रोटोटाइप बनाते समय, यह क्लाइंट-साइड SDK टूल अपने-आप जनरेट करता है.

जब आपकी सेवा और क्लाइंट ऐप्लिकेशन के अपडेट को दोहराया जाता है, तब सर्वर और क्लाइंट-साइड, दोनों के अपडेट डिप्लॉय किए जा सकते हैं.

क्लाइंट डेवलपमेंट का वर्कफ़्लो क्या है?

शुरू करें लेख में, आपको के लिए डेवलपमेंट के पूरे फ़्लो के बारे में बताया गया था.SQL Connect इस गाइड में, आपको अपने स्कीमा से Android SDK टूल जनरेट करने और क्लाइंट क्वेरी और म्यूटेशन के साथ काम करने के बारे में ज़्यादा जानकारी मिलेगी.

संक्षेप में, अपने क्लाइंट ऐप्लिकेशन में जनरेट किए गए Android SDK टूल का इस्तेमाल करने के लिए, आपको ये ज़रूरी शर्तें पूरी करनी होंगी:

  1. अपने Android ऐप्लिकेशन में Firebase जोड़ें.
  2. Gradle में, SQL Connect को डिपेंडेंसी के तौर पर कॉन्फ़िगर करें.
  3. Kotlin सीरियलाइज़ेशन Gradle प्लगिन और Gradle डिपेंडेंसी जोड़ें.

इसके बाद:

  1. अपने ऐप्लिकेशन का स्कीमा डेवलप करें.
  2. SDK टूल जनरेट करने की सुविधा सेट अप करें:

    • हमारे SQL Connect VS Code एक्सटेंशन में मौजूद, ऐप्लिकेशन में SDK टूल जोड़ें बटन की मदद से
    • अपने को अपडेट करके connector.yaml
  3. अपने क्लाइंट कोड को शुरू करें और लाइब्रेरी इंपोर्ट करें.

  4. क्वेरी और म्यूटेशन के लिए कॉल लागू करें.

  5. सेट अप करें और SQL Connect एम्युलेटर का इस्तेमाल करें. साथ ही, इसे दोहराएं.

अपना Kotlin 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 को शामिल करना

SQL Connect और जनरेट किए गए SDK टूल का इस्तेमाल करने के लिए, अपने क्लाइंट कोड को सेट अप करने के लिए, सबसे पहले Firebase के सेटअप से जुड़े सामान्य निर्देशों का पालन करें.SQL Connect

इसके बाद, app/build.gradle.kts में मौजूद plugins सेक्शन में यह जानकारी जोड़ें:

// The Firebase team tests with version 1.8.22; however, other 1.8 versions,
// and all newer versions are expected work too.
kotlin("plugin.serialization") version "1.8.22" // MUST match the version of the Kotlin compiler

इसके बाद, app/build.gradle.kts में मौजूद dependencies सेक्शन में यह जानकारी जोड़ें:

implementation(platform("com.google.firebase:firebase-bom:34.15.0"))
implementation("com.google.firebase:firebase-dataconnect")
implementation("com.google.firebase:firebase-auth") // Optional
implementation("com.google.firebase:firebase-appcheck") // Optional
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") // Newer versions should work too
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.1") // Newer versions should work too

SQL Connect Android SDK टूल शुरू करना

SQL Connect इंस्टेंस को सेट अप करने के लिए इस्तेमाल की गई जानकारी का इस्तेमाल करके, SQL Connect इंस्टेंस शुरू करें. यह जानकारी, डेटाबेस और स्टोरेज > SQL Connect पेज Firebase कंसोल पर मिलेगी.

ConnectorConfig ऑब्जेक्ट

SDK टूल के लिए, कनेक्टर कॉन्फ़िगरेशन ऑब्जेक्ट की ज़रूरत होती है.

यह ऑब्जेक्ट, dataconnect.yaml में मौजूद serviceId और location के साथ-साथ, connector.yaml में मौजूद connectorId से अपने-आप जनरेट होता है.

कनेक्टर इंस्टेंस पाना

अब जबकि आपने कॉन्फ़िगरेशन ऑब्जेक्ट सेट अप कर लिया है, SQL Connect कनेक्टर इंस्टेंस पाएं. आपके कनेक्टर के लिए कोड, SQL Connect एम्युलेटर से जनरेट किया जाएगा. अगर आपके कनेक्टर का नाम movies है और Kotlin पैकेज com.myapplication है, जैसा कि connector.yaml में बताया गया है, तो कनेक्टर ऑब्जेक्ट को कॉल करके वापस पाएं:

val connector = com.myapplication.MoviesConnector.instance

अपने Android SDK टूल से क्वेरी और म्यूटेशन का इस्तेमाल करना

कनेक्टर ऑब्जेक्ट की मदद से, GraphQL सोर्स कोड में तय की गई क्वेरी और म्यूटेशन को चलाया जा सकता है. मान लें कि आपके कनेक्टर में ये ऑपरेशन तय किए गए हैं:

mutation createMovie($title: String!, $releaseYear: Int!, $genre: String!, $rating: Int!) {
  movie_insert(data: {
    title: $title
    releaseYear: $releaseYear
    genre: $genre
    rating: $rating
  })
}

query getMovieByKey($key: Movie_Key!) {
  movie(key: $key) { id title }
}

query listMoviesByGenre($genre: String!) {
  movies(where: {genre: {eq: $genre}}) {
    id
    title
  }
}

इसके बाद, इस तरह कोई मूवी बनाई और वापस पाई जा सकती है:

val connector = MoviesConnector.instance

val addMovieResult1 = connector.createMovie.execute(
  title = "Empire Strikes Back",
  releaseYear = 1980,
  genre = "Sci-Fi",
  rating = 5
)

val movie1 = connector.getMovieByKey.execute(addMovieResult1.data.key)

println("Empire Strikes Back: ${movie1.data.movie}")

एक से ज़्यादा मूवी भी वापस पाई जा सकती हैं:

val connector = MoviesConnector.instance

val addMovieResult2 = connector.createMovie.execute(
  title="Attack of the Clones",
  releaseYear = 2002,
  genre = "Sci-Fi",
  rating = 5
)

val listMoviesResult = connector.listMoviesByGenre.execute(genre = "Sci-Fi")

println(listMoviesResult.data.movies)

इसके अलावा, Flow भी इकट्ठा किया जा सकता है. यह Flow, क्वेरी के execute() तरीके को कॉल करके, क्वेरी का नया नतीजा वापस पाने पर ही कोई नतीजा देगा.

val connector = MoviesConnector.instance

connector.listMoviesByGenre.flow(genre = "Sci-Fi").collect { data ->
  println(data.movies)
}

connector.createMovie.execute(
  title="A New Hope",
  releaseYear = 1977,
  genre = "Sci-Fi",
  rating = 5
)

connector.listMoviesByGenre.execute(genre = "Sci-Fi") // will cause the Flow to get notified

रीयलटाइम में होने वाले बदलावों की सदस्यता लेना

SQL Connect से रीयलटाइम अपडेट पाना लेख पढ़ेंSQL Connect.

इन्यूमरेट किए गए फ़ील्ड में होने वाले बदलावों को मैनेज करना

किसी ऐप्लिकेशन के स्कीमा में इन्यूमरेट किए गए फ़ील्ड हो सकते हैं. इन्हें आपकी GraphQL क्वेरी से ऐक्सेस किया जा सकता है.

ऐप्लिकेशन के डिज़ाइन में बदलाव होने पर, इन्यूमरेट किए गए फ़ील्ड के लिए नई वैल्यू जोड़ी जा सकती हैं. उदाहरण के लिए, मान लें कि ऐप्लिकेशन के लाइफ़साइकल में बाद में, आपने AspectRatio इनम में FULLSCREEN वैल्यू जोड़ने का फ़ैसला किया.

SQL Connect वर्कफ़्लो में, क्वेरी और SDK टूल अपडेट करने के लिए, लोकल डेवलपमेंट टूलिंग का इस्तेमाल किया जा सकता है.

हालांकि, अपने क्लाइंट का अपडेट किया गया वर्शन रिलीज़ करने से पहले, डिप्लॉय किए गए पुराने क्लाइंट काम नहीं कर सकते.

लचीले तरीके से लागू करने का उदाहरण

जनरेट किया गया SDK टूल, अज्ञात वैल्यू को मैनेज करने के लिए मजबूर करता है, क्योंकि ग्राहक के कोड को EnumValue ऑब्जेक्ट को अनरैप करना होता है. यह ऑब्जेक्ट, इनम की ज्ञात वैल्यू के लिए EnumValue.Known या अज्ञात वैल्यू के लिए EnumValue.Unknown होता है.

val result = connector.listMoviesByAspectRatio.execute(AspectRatio.WIDESCREEN)
val encounteredAspectRatios = mutableSetOf<String>()

result.data.movies
  .mapNotNull { it.otherAspectRatios }
  .forEach { otherAspectRatios ->
    otherAspectRatios
      .filterNot { it.value == AspectRatio.WIDESCREEN }
      .forEach {
        when (it) {
          is EnumValue.Known -> encounteredAspectRatios.add(it.value.name)
          is EnumValue.Unknown ->
            encounteredAspectRatios.add("[unknown ratio: ${it.stringValue}]")
        }
      }
  }

println(
  "Widescreen movies also include additional aspect ratios: " +
    encounteredAspectRatios.sorted().joinToString()
)

क्लाइंट-साइड कैशिंग की सुविधा चालू करना

SQL Connect में, क्लाइंट-साइड कैशिंग की सुविधा मौजूद है. इसे चालू करने के लिए, आप connector.yaml फ़ाइल में बदलाव कर सकते हैं. इस सुविधा के चालू होने पर, जनरेट किए गए क्लाइंट SDK टूल, क्वेरी के जवाबों को स्थानीय तौर पर कैश करेंगे. इससे आपके ऐप्लिकेशन के डेटाबेस के अनुरोधों की संख्या कम हो सकती है. साथ ही, नेटवर्क की उपलब्धता में रुकावट आने पर भी, आपके ऐप्लिकेशन के डेटाबेस पर निर्भर हिस्से काम कर सकते हैं.

क्लाइंट-साइड कैशिंग की सुविधा चालू करने के लिए, अपने कनेक्टर कॉन्फ़िगरेशन में क्लाइंट कैशिंग कॉन्फ़िगरेशन जोड़ें:

generate:
  kotlinSdk:
    outputDir: "../android"
    package: "com.google.firebase.dataconnect.generated"
    clientCache:
      maxAge: 5s
      storage: persistent

इस कॉन्फ़िगरेशन में दो पैरामीटर होते हैं. दोनों पैरामीटर ज़रूरी नहीं हैं:

  • maxAge: कैश किए गए जवाब की ज़्यादा से ज़्यादा उम्र. इसके बाद, क्लाइंट SDK टूल नई वैल्यू फ़ेच करेगा. उदाहरण: "0", "30s", "1h30m".

    maxAge की डिफ़ॉल्ट वैल्यू 0 होती है. इसका मतलब है कि जवाब कैश किए जाते हैं, लेकिन क्लाइंट SDK टूल हमेशा नई वैल्यू फ़ेच करेगा. कैश की गई वैल्यू का इस्तेमाल सिर्फ़ तब किया जाएगा, जब execute() के लिए CACHE_ONLY तय किया गया हो.

  • storage: क्लाइंट SDK टूल को, जवाबों को persistent स्टोरेज या memory में कैश करने के लिए कॉन्फ़िगर किया जा सकता है. persistent स्टोरेज में कैश किए गए नतीजे, ऐप्लिकेशन को रीस्टार्ट करने पर भी बने रहेंगे. Android SDK टूल में, डिफ़ॉल्ट रूप से persistent का इस्तेमाल किया जाता है.

अपने कनेक्टर के कैशिंग कॉन्फ़िगरेशन को अपडेट करने के बाद, अपने क्लाइंट SDK टूल को फिर से जनरेट करें और अपने ऐप्लिकेशन को फिर से बनाएं. ऐसा करने के बाद, execute() जवाबों को कैश करेगा और आपके कॉन्फ़िगर की गई नीति के मुताबिक, कैश की गई वैल्यू का इस्तेमाल करेगा. आम तौर पर, यह प्रोसेस अपने-आप होती है. इसके लिए, आपको कोई और कार्रवाई नहीं करनी पड़ती. हालांकि, इन बातों का ध्यान रखें:

  • execute() का डिफ़ॉल्ट व्यवहार ऊपर बताया गया है: अगर किसी क्वेरी के लिए कोई नतीजा कैश किया जाता है और कैश की गई वैल्यू, maxAge से पुरानी नहीं है, तो कैश की गई वैल्यू का इस्तेमाल करें. इस डिफ़ॉल्ट व्यवहार को PREFER_CACHE नीति कहा जाता है.

    execute() के अलग-अलग कॉल के लिए, यह भी तय किया जा सकता है कि सिर्फ़ कैश की गई वैल्यू (CACHE_ONLY) दिखाई जाएं या सर्वर से बिना शर्त नई वैल्यू (SERVER_ONLY) फ़ेच की जाएं.

    val queryResult = queryRef.execute(QueryRef.FetchPolicy.CACHE_ONLY)
    
    val queryResult = queryRef.execute(QueryRef.FetchPolicy.SERVER_ONLY)
    

    अपने Android ऐप्लिकेशन का प्रोटोटाइप बनाना और उसकी परफ़ॉर्मेंस की जांच करना

    स्थानीय एम्युलेटर का इस्तेमाल करने के लिए, क्लाइंट को इंस्ट्रूमेंट करना

    आप SQL Connect एम्युलेटर का इस्तेमाल, SQL Connect VS Code एक्सटेंशन या CLI से कर सकते हैं.

    दोनों स्थितियों में, एम्युलेटर से कनेक्ट करने के लिए ऐप्लिकेशन को इंस्ट्रूमेंट करने का तरीका एक ही है.

    val connector = MoviesConnector.instance
    
    // Connect to the emulator on "10.0.2.2:9399"
    connector.dataConnect.useEmulator()
    
    // (alternatively) if you're running your emulator on non-default port:
    connector.dataConnect.useEmulator(port = 9999)
    
    // Make calls from your app
    
    

    प्रॉडक्शन रिसॉर्स पर स्विच करने के लिए, एम्युलेटर से कनेक्ट करने वाली लाइनों को टिप्पणी के तौर पर मार्क करें.

    SQL Connect SDK टूल में SQL टाइप

    SQL Connect सर्वर, सामान्य और कस्टम GraphQL डेटा टाइप दिखाता है. इन्हें SDK टूल में इस तरह दिखाया जाता है.

    SQL Connect टाइप Kotlin
    स्ट्रिंग स्ट्रिंग
    Int Int (32-बिट इंटिजर)
    फ़्लोट Double (64-बिट फ़्लोट)
    बूलियन बूलियन
    यूयूआईडी java.util.UUID
    तारीख com.google.firebase.dataconnect.LocalDate (16.0.0-beta03 तक java.util.Date था)
    टाइमस्टैम्प com.google.firebase.Timestamp
    Int64 ज़्यादा समय के लिए
    कोई भी com.google.firebase.dataconnect.AnyValue