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

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

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

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

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

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

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

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

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

इसके बाद:

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

  3. अपने क्लाइंट कोड को शुरू करें और लाइब्रेरी इंपोर्ट करें.

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

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

अपना Kotlin SDK टूल जनरेट करना

अपने ऐप्लिकेशन में SQL Connect से जनरेट किए गए एसडीके सेट अप करने के लिए, Firebase सीएलआई का इस्तेमाल करें. init कमांड को मौजूदा फ़ोल्डर में मौजूद सभी ऐप्लिकेशन का पता लगाना चाहिए. साथ ही, जनरेट किए गए SDK टूल अपने-आप इंस्टॉल होने चाहिए.

firebase init dataconnect:sdk

प्रोटोटाइपिंग के दौरान एसडीके अपडेट करना

अगर आपने SQL Connect VS Code एक्सटेंशन इंस्टॉल किया है, तो यह जनरेट किए गए एसडीके को हमेशा अप-टू-डेट रखेगा.

अगर SQL Connect VS Code एक्सटेंशन का इस्तेमाल नहीं किया जाता है, तो जनरेट किए गए SDK टूल को अप-टू-डेट रखने के लिए, Firebase CLI का इस्तेमाल किया जा सकता है.

firebase dataconnect:sdk:generate --watch

बिल्ड पाइपलाइन में SDK जनरेट करना

सीआई/सीडी बिल्ड प्रोसेस में SQL Connect SDK टूल जनरेट करने के लिए, Firebase CLI का इस्तेमाल किया जा सकता है.

firebase dataconnect:sdk:generate

क्लाइंट कोड सेट अप करना

अपने क्लाइंट कोड में SQL Connect को शामिल करना

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

इसके बाद, 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.12.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 इंस्टेंस को शुरू करें. यह जानकारी, Firebase कंसोल के SQL Connect टैब में उपलब्ध है.

ConnectorConfig ऑब्जेक्ट

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

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

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

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

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 इकट्ठा करने का विकल्प भी होता है जो सिर्फ़ तब नतीजा देगा, जब क्वेरी के 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

गिनती वाले फ़ील्ड में हुए बदलावों को हैंडल करना

किसी ऐप्लिकेशन के स्कीमा में गिनती की जानकारी शामिल हो सकती है. इसे आपकी GraphQL क्वेरी ऐक्सेस कर सकती हैं.

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

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

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

रीसाइलेंट तरीके से लागू करने का उदाहरण

जनरेट किया गया एसडीके, ऐसी वैल्यू को हैंडल करता है जिनके बारे में जानकारी नहीं है. ऐसा इसलिए, क्योंकि ग्राहक के कोड को EnumValue ऑब्जेक्ट को अनरैप करना होता है. यह ऑब्जेक्ट, जानी-पहचानी enum वैल्यू के लिए 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 फ़ाइल में बदलाव करना होगा. इस सुविधा के चालू होने पर, जनरेट किए गए क्लाइंट एसडीके, क्वेरी के जवाबों को स्थानीय तौर पर कैश मेमोरी में सेव करेंगे. इससे आपके ऐप्लिकेशन के डेटाबेस अनुरोधों की संख्या कम हो सकती है. साथ ही, नेटवर्क उपलब्ध न होने पर भी, आपके ऐप्लिकेशन के डेटाबेस पर निर्भर हिस्से काम कर सकते हैं.

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

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

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

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

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

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

कनेक्टर के कैश मेमोरी कॉन्फ़िगरेशन को अपडेट करने के बाद, अपने क्लाइंट एसडीके फिर से जनरेट करें और अपने ऐप्लिकेशन को फिर से बनाएं. ऐसा करने के बाद, 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 एक्सटेंशन या सीएलआई से ऐक्सेस किया जा सकता है.

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

    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 एसडीके में SQL टाइप

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

    SQL Connect टाइप Kotlin
    स्ट्रिंग स्ट्रिंग
    Int Int (32-बिट पूर्णांक)
    फ़्लोट डबल (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