জেনারেট করা Android SDK ব্যবহার করুন

Firebase SQL Connect ক্লায়েন্ট এসডিকে আপনাকে সরাসরি একটি ফায়ারবেস অ্যাপ থেকে আপনার সার্ভার-সাইড কোয়েরি এবং মিউটেশন কল করার সুযোগ দেয়। আপনি আপনার SQL Connect সার্ভিসে যে স্কিমা, কোয়েরি এবং মিউটেশনগুলো ডেপ্লয় করবেন, সেগুলোর ডিজাইন করার পাশাপাশি একটি কাস্টম ক্লায়েন্ট এসডিকে তৈরি করেন। তারপর, এই এসডিকে-র মেথডগুলো আপনার ক্লায়েন্ট লজিকে ইন্টিগ্রেট করেন।

আমরা অন্যত্র যেমন উল্লেখ করেছি, এটা মনে রাখা গুরুত্বপূর্ণ যে SQL Connect কোয়েরি এবং মিউটেশনগুলো ক্লায়েন্ট কোড দ্বারা সাবমিট করা হয় না এবং সার্ভারে এক্সিকিউট করা হয় না। পরিবর্তে, ডেপ্লয় করার সময়, SQL Connect অপারেশনগুলো ক্লাউড ফাংশনের মতো সার্ভারে সংরক্ষিত হয়। এর মানে হলো, বিদ্যমান ব্যবহারকারীদের (উদাহরণস্বরূপ, অ্যাপের পুরোনো সংস্করণগুলোতে) সমস্যা এড়াতে আপনাকে সংশ্লিষ্ট ক্লায়েন্ট-সাইড পরিবর্তনগুলো ডেপ্লয় করতে হবে।

এই কারণেই SQL Connect আপনাকে এমন একটি ডেভেলপার পরিবেশ এবং টুলিং প্রদান করে, যা দিয়ে আপনি আপনার সার্ভারে ডেপ্লয় করা স্কিমা, কোয়েরি এবং মিউটেশনগুলোর প্রোটোটাইপ তৈরি করতে পারেন। এছাড়াও, আপনি প্রোটোটাইপ করার সময় এটি স্বয়ংক্রিয়ভাবে ক্লায়েন্ট-সাইড SDK তৈরি করে দেয়।

When you've iterated updates to your service and client apps, both server- and client-side updates are ready to deploy.

ক্লায়েন্ট ডেভেলপমেন্ট ওয়ার্কফ্লো কী?

আপনি যদি ' Get started' অংশটি অনুসরণ করে থাকেন, তাহলে আপনাকে SQL Connect এর সামগ্রিক ডেভেলপমেন্ট ফ্লো-এর সাথে পরিচয় করিয়ে দেওয়া হয়েছে। এই গাইডে, আপনি আপনার স্কিমা থেকে অ্যান্ড্রয়েড SDK তৈরি করা এবং ক্লায়েন্ট কোয়েরি ও মিউটেশন নিয়ে কাজ করার বিষয়ে আরও বিস্তারিত তথ্য পাবেন।

To summarize, to use generated Android SDKs in your client apps, you'll follow these prerequisite steps:

  1. আপনার অ্যান্ড্রয়েড অ্যাপে ফায়ারবেস যুক্ত করুন।
  2. Gradle-এ SQL Connect একটি ডিপেন্ডেন্সি হিসেবে কনফিগার করুন।
  3. Add the Kotlin Serialization Gradle plugin and Gradle dependency.

তারপর:

  1. আপনার অ্যাপের স্কিমা তৈরি করুন।
  2. SDK জেনারেশন সেট আপ করুন:

  3. Initialize your client code and import libraries .

  4. কোয়েরি এবং মিউটেশন কলগুলো বাস্তবায়ন করুন

  5. Set up and use the SQL Connect emulator and iterate.

আপনার কোটলিন এসডিকে তৈরি করুন

Use the Firebase CLI to set up SQL Connect generated SDKs in your apps. The init command should detect all apps in the current folder and install generated SDKs automatically.

firebase init dataconnect:sdk

প্রোটোটাইপিং করার সময় SDK আপডেট করুন।

If you have SQL Connect VS Code extension installed, it will always keep generated SDKs up to date.

If you don't use SQL Connect VS Code extension, you can use Firebase CLI to keep generated SDKs up to date.

firebase dataconnect:sdk:generate --watch

বিল্ড পাইপলাইনে SDK তৈরি করুন

You can use the Firebase CLI to generate SQL Connect SDKs in CI/CD build processes.

firebase dataconnect:sdk:generate

ক্লায়েন্ট কোড সেট আপ করুন

আপনার ক্লায়েন্ট কোডে SQL Connect অন্তর্ভুক্ত করুন

SQL Connect এবং আপনার তৈরি করা SDK ব্যবহার করার জন্য ক্লায়েন্ট কোড সেট আপ করতে, প্রথমে ফায়ারবেসের সাধারণ সেটআপ নির্দেশাবলী অনুসরণ করুন।

Then, add the following into the plugins section in app/build.gradle.kts :

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

Then, add the following into the dependencies section in app/build.gradle.kts :

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 অ্যান্ড্রয়েড SDK শুরু করুন

Initialize your SQL Connect instance using the information you used to set up SQL Connect . Find this information in the Databases & Storage > SQL Connect page of the Firebase console.

ConnectorConfig অবজেক্ট

The SDK requires a connector configuration object.

This object is automatically generated from serviceId and location in dataconnect.yaml , and connectorId in connector.yaml .

একটি কানেক্টর ইনস্ট্যান্স পাওয়া

এখন যেহেতু আপনি একটি কনফিগারেশন অবজেক্ট সেট আপ করেছেন, একটি SQL Connect কানেক্টর ইনস্ট্যান্স নিন। আপনার কানেক্টরের জন্য কোডটি SQL Connect এমুলেটর দ্বারা তৈরি করা হবে। যদি আপনার কানেক্টরের নাম movies হয় এবং Kotlin প্যাকেজটি com.myapplication হয়, যেমনটি connector.yaml এ উল্লেখ করা আছে, তাহলে নিম্নলিখিত কমান্ডটি কল করে কানেক্টর অবজেক্টটি পুনরুদ্ধার করুন:

val connector = com.myapplication.MoviesConnector.instance

আপনার অ্যান্ড্রয়েড এসডিকে থেকে কোয়েরি এবং মিউটেশন ব্যবহার করুন

With the connector object, you can run queries and mutations as defined in the GraphQL source code. Suppose your connector has these operations defined:

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

then you could create and retrieve a movie as follows:

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 থেকে রিয়েলটাইম আপডেট কীভাবে পাবেন তা দেখুন।

গণনা ক্ষেত্রগুলির পরিবর্তনগুলি পরিচালনা করুন

An app's schema can contain enumerations , which can be accessed by your GraphQL queries .

As an app's design changes, you may add new enum supported values. For example, imagine that later in your application's lifecycle you decide to add a FULLSCREEN value to the AspectRatio enum.

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 : The maximum age a cached response can be before the client SDK fetches fresh values. Examples: "0", "30s", "1h30m".

    maxAge এর ডিফল্ট মান হলো 0 , যার অর্থ হলো রেসপন্সগুলো ক্যাশ করা থাকে, কিন্তু ক্লায়েন্ট SDK সর্বদা নতুন মান ফেচ করবে। ক্যাশ করা মানগুলো শুধুমাত্র তখনই ব্যবহৃত হবে যখন execute() ফাংশনে CACHE_ONLY নির্দিষ্ট করা থাকবে।

  • storage : ক্লায়েন্ট SDK-কে রেসপন্সগুলো persistent স্টোরেজ অথবা memory ক্যাশ করার জন্য কনফিগার করা যেতে পারে। persistent স্টোরেজে ক্যাশ করা ফলাফল অ্যাপ পুনরায় চালু করার পরেও অক্ষুণ্ণ থাকবে। অ্যান্ড্রয়েড SDK-গুলোতে ডিফল্ট হলো persistent

আপনার কানেক্টরের ক্যাশিং কনফিগারেশন আপডেট করার পর, আপনার ক্লায়েন্ট SDK-গুলো পুনরায় তৈরি করুন এবং আপনার অ্যাপটি রি-বিল্ড করুন। এটি করার পরে, execute() ফাংশনটি রেসপন্স ক্যাশ করবে এবং আপনার কনফিগার করা পলিসি অনুযায়ী ক্যাশ করা ভ্যালুগুলো ব্যবহার করবে। এটি সাধারণত আপনার কোনো অতিরিক্ত পদক্ষেপ ছাড়াই স্বয়ংক্রিয়ভাবে ঘটে; তবে, নিম্নলিখিত বিষয়গুলো লক্ষ্য করুন:

  • execute() ফাংশনের ডিফল্ট আচরণ উপরে বর্ণিত হয়েছে: যদি কোনো কোয়েরির জন্য একটি ফলাফল ক্যাশ করা থাকে এবং ক্যাশ করা মানটি maxAge চেয়ে পুরোনো না হয়, তাহলে সেই ক্যাশ করা মানটিই ব্যবহার করা হয়। এই ডিফল্ট আচরণকে PREFER_CACHE পলিসি বলা হয়।

    You can also specify to individual invocations of execute() to either only serve cached values ( CACHE_ONLY ) or to unconditionally fetch fresh values from the server ( SERVER_ONLY ).

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

    আপনার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটির প্রোটোটাইপ তৈরি করুন এবং পরীক্ষা করুন।

    স্থানীয় এমুলেটর ব্যবহার করার জন্য ক্লায়েন্টদের নির্দেশ দিন।

    আপনি SQL Connect VS Code এক্সটেনশন অথবা CLI থেকে SQL Connect এমুলেটরটি ব্যবহার করতে পারেন।

    উভয় ক্ষেত্রেই এমুলেটরের সাথে সংযোগ করার জন্য অ্যাপটিকে প্রস্তুত করার পদ্ধতি একই।

    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 ধরণ কোটলিন
    স্ট্রিং স্ট্রিং
    ইন্ট Int (৩২-বিট পূর্ণসংখ্যা)
    ভাসা ডাবল (৬৪-বিট ফ্লোট)
    বুলিয়ান বুলিয়ান
    UUID 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