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

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

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

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

যখন আপনি আপনার পরিষেবা এবং ক্লায়েন্ট অ্যাপগুলিতে আপডেটগুলি পুনরাবৃত্তি করবেন, তখন সার্ভার- এবং ক্লায়েন্ট-সাইড উভয় আপডেটই স্থাপনের জন্য প্রস্তুত হয়ে যাবে।

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

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

সংক্ষেপে, আপনার ক্লায়েন্ট অ্যাপে তৈরি করা অ্যান্ড্রয়েড এসডিকে ব্যবহার করতে হলে, আপনাকে এই পূর্বশর্তমূলক ধাপগুলো অনুসরণ করতে হবে:

  1. আপনার অ্যান্ড্রয়েড অ্যাপে ফায়ারবেস যুক্ত করুন।
  2. Gradle-এ SQL Connect একটি ডিপেন্ডেন্সি হিসেবে কনফিগার করুন।
  3. Kotlin Serialization Gradle প্লাগইন এবং Gradle ডিপেন্ডেন্সি যোগ করুন।

তারপর:

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

  3. আপনার ক্লায়েন্ট কোড শুরু করুন এবং লাইব্রেরিগুলো ইম্পোর্ট করুন

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

  5. SQL Connect এমুলেটরটি সেট আপ করে ব্যবহার করুন এবং পুনরাবৃত্তি করুন।

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

আপনার অ্যাপগুলিতে SQL Connect দ্বারা তৈরি SDK সেট আপ করতে Firebase CLI ব্যবহার করুন। 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 ব্যবহার করার জন্য ক্লায়েন্ট কোড সেট আপ করতে, প্রথমে ফায়ারবেসের সাধারণ সেটআপ নির্দেশাবলী অনুসরণ করুন।

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

SQL Connect সেট আপ করার জন্য আপনি যে তথ্য ব্যবহার করেছিলেন, তা দিয়ে আপনার SQL SQL Connect ইনস্ট্যান্সটি চালু করুন (এই সমস্ত তথ্য Firebase কনসোলের SQL Connect ট্যাবে পাওয়া যাবে)।

ConnectorConfig অবজেক্ট

এসডিকে-টির জন্য একটি কানেক্টর কনফিগারেশন অবজেক্ট প্রয়োজন।

এই অবজেক্টটি dataconnect.yaml এর serviceIdlocation এবং connector.yaml এর connectorId থেকে স্বয়ংক্রিয়ভাবে তৈরি হয়।

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

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

val connector = com.myapplication.MoviesConnector.instance

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

কানেক্টর অবজেক্টের সাহায্যে, আপনি 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 ওয়ার্কফ্লোতে, আপনি আপনার কোয়েরি এবং 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 স্টোরেজে ক্যাশ করা ফলাফল অ্যাপ পুনরায় চালু করার পরেও অক্ষুণ্ণ থাকবে। অ্যান্ড্রয়েড 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)
    

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

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

    আপনি 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