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

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

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

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

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

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

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

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

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

इसके बाद:

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

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

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

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

अपना Kotlin एसडीके जनरेट करना

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

firebase init dataconnect:sdk

प्रोटोटाइप बनाते समय एसडीके अपडेट करना

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

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

firebase dataconnect:sdk:generate --watch

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

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

firebase dataconnect:sdk:generate

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

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

SQL Connect और जनरेट किए गए एसडीके का इस्तेमाल करने के लिए, अपने क्लाइंट कोड को सेट अप करने के लिए, सबसे पहले 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.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 ऑब्जेक्ट

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

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

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

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

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

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

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

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

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

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

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

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

    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