অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টালস 06.1: একটি রুম ডাটাবেস তৈরি করুন, অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল 06.1: একটি রুম ডেটাবেস তৈরি করুন

এই কোডল্যাবটি অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোর্সের অংশ। আপনি যদি ক্রমানুসারে কোডল্যাবগুলির মাধ্যমে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন৷ সমস্ত কোর্স কোডল্যাব অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোডল্যাব ল্যান্ডিং পৃষ্ঠায় তালিকাভুক্ত করা হয়েছে।

ভূমিকা

ব্যবহারকারী অ্যাপটি বন্ধ করার পরেও বেশিরভাগ অ্যাপে ডেটা রাখা দরকার। উদাহরণস্বরূপ, অ্যাপটি একটি প্লেলিস্ট, গেম আইটেমগুলির একটি তালিকা, খরচ এবং আয়ের রেকর্ড, নক্ষত্রপুঞ্জের একটি ক্যাটালগ বা সময়ের সাথে সাথে ঘুমের ডেটা সংরক্ষণ করতে পারে। সাধারণত, আপনি অবিরাম ডেটা সঞ্চয় করার জন্য একটি ডাটাবেস ব্যবহার করবেন।

Room হল একটি ডাটাবেস লাইব্রেরি যা Android Jetpack- এর অংশ। Room একটি ডাটাবেস সেট আপ এবং কনফিগার করার অনেক কাজের যত্ন নেয় এবং আপনার অ্যাপের জন্য সাধারণ ফাংশন কল ব্যবহার করে ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করা সম্ভব করে তোলে। হুডের নীচে, Room হল একটি SQLite ডাটাবেসের উপরে একটি বিমূর্ত স্তর। Room পরিভাষা, এবং আরও জটিল প্রশ্নের জন্য ক্যোয়ারী সিনট্যাক্স, SQLite মডেল অনুসরণ করুন।

নীচের চিত্রটি দেখায় যে এই কোর্সে প্রস্তাবিত সামগ্রিক আর্কিটেকচারের সাথে Room ডাটাবেস কীভাবে ফিট করে।

আপনি ইতিমধ্যে কি জানা উচিত

আপনার সাথে পরিচিত হওয়া উচিত:

  • একটি Android অ্যাপের জন্য একটি মৌলিক ব্যবহারকারী ইন্টারফেস (UI) তৈরি করা
  • কার্যকলাপ, টুকরা, এবং দৃশ্য ব্যবহার করে।
  • টুকরোগুলির মধ্যে নেভিগেট করা এবং টুকরোগুলির মধ্যে ডেটা পাস করতে সেফ আর্গস (একটি গ্রেডল প্লাগইন) ব্যবহার করে।
  • মডেল, ভিউ-মডেল কারখানা, এবং LiveData এবং এর পর্যবেক্ষক দেখুন। এই আর্কিটেকচার কম্পোনেন্ট বিষয়গুলি এই কোর্সে একটি আগের কোডল্যাবে কভার করা হয়েছে।
  • SQL ডাটাবেস এবং SQLite ভাষার একটি প্রাথমিক ধারণা। একটি দ্রুত ওভারভিউ বা রিফ্রেশার জন্য SQLite প্রাইমার দেখুন।

আপনি কি শিখবেন

  • ডেটা বজায় রাখার জন্য কীভাবে একটি Room ডাটাবেস তৈরি এবং ইন্টারঅ্যাক্ট করবেন।
  • ডাটাবেসের একটি টেবিল সংজ্ঞায়িত করে এমন একটি ডেটা ক্লাস কীভাবে তৈরি করবেন।
  • এসকিউএল কোয়েরিতে কোটলিন ফাংশন ম্যাপ করতে ডেটা অ্যাক্সেস অবজেক্ট (DAO) কীভাবে ব্যবহার করবেন।
  • আপনার ডাটাবেস কাজ করছে কিনা তা কীভাবে পরীক্ষা করবেন।

আপনি কি করবেন

  • রাতের ঘুমের ডেটার জন্য একটি ইন্টারফেস সহ একটি Room ডাটাবেস তৈরি করুন।
  • প্রদত্ত পরীক্ষাগুলি ব্যবহার করে ডাটাবেস পরীক্ষা করুন।

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

অ্যাপটিতে দুটি স্ক্রীন রয়েছে, যা খন্ড দ্বারা উপস্থাপিত হয়েছে, যেমনটি নীচের চিত্রে দেখানো হয়েছে।

বাম দিকে দেখানো প্রথম স্ক্রিনে ট্র্যাকিং শুরু এবং বন্ধ করার জন্য বোতাম রয়েছে৷ স্ক্রিনটি ব্যবহারকারীর ঘুমের সমস্ত ডেটা দেখায়। ক্লিয়ার বোতামটি স্থায়ীভাবে সমস্ত ডেটা মুছে দেয় যা অ্যাপ ব্যবহারকারীর জন্য সংগ্রহ করেছে।

দ্বিতীয় স্ক্রীন, ডানদিকে দেখানো হয়েছে, ঘুমের মানের রেটিং নির্বাচন করার জন্য। অ্যাপে, রেটিংটি সংখ্যাগতভাবে উপস্থাপন করা হয়। বিকাশের উদ্দেশ্যে, অ্যাপটি মুখের আইকন এবং তাদের সংখ্যাসূচক সমতুল্য উভয়ই দেখায়।

ব্যবহারকারীর প্রবাহ নিম্নরূপ:

  • ব্যবহারকারী অ্যাপটি খোলে এবং স্লিপ-ট্র্যাকিং স্ক্রিন দিয়ে উপস্থাপিত হয়।
  • ব্যবহারকারী স্টার্ট বোতামে ট্যাপ করে। এটি শুরুর সময় রেকর্ড করে এবং এটি প্রদর্শন করে। স্টার্ট বোতামটি নিষ্ক্রিয় করা হয়েছে এবং স্টপ বোতামটি সক্রিয় করা হয়েছে।
  • ব্যবহারকারী স্টপ বোতামে ট্যাপ করে। এটি শেষের সময় রেকর্ড করে এবং ঘুমের মানের স্ক্রিন খোলে।
  • ব্যবহারকারী একটি ঘুমের মানের আইকন নির্বাচন করে। স্ক্রিন বন্ধ হয়ে যায়, এবং ট্র্যাকিং স্ক্রীন ঘুমের শেষ সময় এবং ঘুমের গুণমান প্রদর্শন করে। স্টপ বোতামটি নিষ্ক্রিয় করা হয়েছে এবং স্টার্ট বোতামটি সক্ষম করা হয়েছে। অ্যাপটি অন্য রাতের জন্য প্রস্তুত।
  • যখনই ডাটাবেসে ডেটা থাকে তখন ক্লিয়ার বোতামটি সক্রিয় থাকে। ব্যবহারকারী যখন ক্লিয়ার বোতামে আলতো চাপেন, তখন তাদের সমস্ত ডেটা অবলম্বন ছাড়াই মুছে ফেলা হয় — সেখানে "আপনি কি নিশ্চিত?" বার্তা

এই অ্যাপটি একটি সরলীকৃত আর্কিটেকচার ব্যবহার করে, যেমনটি সম্পূর্ণ আর্কিটেকচারের প্রসঙ্গে নীচে দেখানো হয়েছে। অ্যাপ্লিকেশন শুধুমাত্র নিম্নলিখিত উপাদান ব্যবহার করে:

  • UI কন্ট্রোলার
  • মডেল এবং LiveData দেখুন
  • একটি রুম ডাটাবেস

ধাপ 1: স্টার্টার অ্যাপটি ডাউনলোড করুন এবং চালান

  1. GitHub থেকে TrackMySleepQuality-Starter অ্যাপটি ডাউনলোড করুন।
  2. অ্যাপটি তৈরি করুন এবং চালান। অ্যাপটি SleepTrackerFragment খণ্ডের জন্য UI দেখায়, কিন্তু কোনো ডেটা নেই। বোতামগুলি ট্যাপগুলিতে সাড়া দেয় না।

ধাপ 2: স্টার্টার অ্যাপটি পরিদর্শন করুন

  1. Gradle ফাইলগুলি একবার দেখুন:
  • প্রকল্প Gradle ফাইল
    প্রকল্প-স্তরের build.gradle ফাইলে, লাইব্রেরি সংস্করণ নির্দিষ্ট করে এমন ভেরিয়েবলগুলি লক্ষ্য করুন। স্টার্টার অ্যাপে ব্যবহৃত সংস্করণগুলি একসাথে ভাল কাজ করে এবং এই অ্যাপের সাথে ভাল কাজ করে। আপনি এই কোডল্যাবটি শেষ করার সময়, Android স্টুডিও আপনাকে কিছু সংস্করণ আপডেট করার জন্য অনুরোধ করতে পারে। আপনি অ্যাপটিতে থাকা সংস্করণগুলি আপডেট করতে চান বা থাকতে চান তা আপনার উপর নির্ভর করে। আপনি যদি "অদ্ভুত" সংকলন ত্রুটির মধ্যে পড়েন, তাহলে চূড়ান্ত সমাধান অ্যাপ ব্যবহার করে এমন লাইব্রেরি সংস্করণগুলির সংমিশ্রণ ব্যবহার করার চেষ্টা করুন।
  • মডিউল গ্রেডল ফাইল। Room সহ সমস্ত অ্যান্ড্রয়েড জেটপ্যাক লাইব্রেরির জন্য প্রদত্ত নির্ভরতা এবং কোরোটিনের নির্ভরতাগুলি লক্ষ্য করুন৷
  1. প্যাকেজ এবং UI দেখে নিন। অ্যাপটি কার্যকারিতা দ্বারা গঠিত। প্যাকেজটিতে স্থানধারক ফাইল রয়েছে যেখানে আপনি কোডল্যাবগুলির এই সিরিজ জুড়ে কোড যোগ করবেন।
  • ডাটাবেস প্যাকেজ , Room ডাটাবেসের সাথে সম্পর্কিত সমস্ত কোডের জন্য database
  • স্লিপ sleepquality এবং sleeptracker প্যাকেজগুলিতে প্রতিটি স্ক্রিনের জন্য ফ্র্যাগমেন্ট, ভিউ মডেল এবং মডেল ফ্যাক্টরি রয়েছে।
  1. Util.kt ফাইলটি দেখুন, যেটিতে ঘুমের মানের ডেটা প্রদর্শন করতে সাহায্য করার জন্য ফাংশন রয়েছে। কিছু কোড মন্তব্য করা হয়েছে কারণ এটি একটি ভিউ মডেল উল্লেখ করে যা আপনি পরে তৈরি করেন।
  2. androidTest ফোল্ডারটি দেখুন ( SleepDatabaseTest.kt )। ডাটাবেসটি উদ্দেশ্য অনুযায়ী কাজ করে তা যাচাই করতে আপনি এই পরীক্ষাটি ব্যবহার করবেন।

অ্যান্ড্রয়েডে, ডেটা ক্লাসে উপস্থাপিত হয় এবং ফাংশন কল ব্যবহার করে ডেটা অ্যাক্সেস এবং পরিবর্তন করা হয়। যাইহোক, ডাটাবেস জগতে, আপনার সত্তা এবং প্রশ্নগুলির প্রয়োজন।

  • একটি সত্তা একটি বস্তু বা ধারণার প্রতিনিধিত্ব করে, এবং এর বৈশিষ্ট্যগুলিকে ডাটাবেসে সংরক্ষণ করে। একটি সত্তা ক্লাস একটি টেবিল সংজ্ঞায়িত করে, এবং সেই শ্রেণীর প্রতিটি উদাহরণ টেবিলের একটি সারি প্রতিনিধিত্ব করে। প্রতিটি সম্পত্তি একটি কলাম সংজ্ঞায়িত করে। আপনার অ্যাপে, সত্তা একটি রাতের ঘুমের তথ্য ধারণ করতে চলেছে।
  • একটি ক্যোয়ারী একটি ডাটাবেস টেবিল বা টেবিলের সংমিশ্রণ থেকে ডেটা বা তথ্যের জন্য একটি অনুরোধ, বা ডেটার উপর একটি ক্রিয়া সম্পাদন করার অনুরোধ। সাধারণ প্রশ্ন হল সত্ত্বা পাওয়ার, সন্নিবেশ করা এবং আপডেট করার জন্য। উদাহরণস্বরূপ, আপনি রেকর্ডে থাকা সমস্ত ঘুমের রাতের জন্য জিজ্ঞাসা করতে পারেন, শুরুর সময় অনুসারে সাজানো।

Kotlin ডেটা ক্লাস থেকে SQLite টেবিলে সংরক্ষণ করা যেতে পারে এমন সত্তা এবং ফাংশন ঘোষণা থেকে SQL কোয়েরি পর্যন্ত পেতে Room আপনার জন্য সমস্ত কঠোর পরিশ্রম করে।

আপনাকে অবশ্যই প্রতিটি সত্তাকে একটি টীকাযুক্ত ডেটা ক্লাস হিসাবে এবং ইন্টারঅ্যাকশনগুলিকে একটি টীকাযুক্ত ইন্টারফেস, একটি ডেটা অ্যাক্সেস অবজেক্ট (DAO) হিসাবে সংজ্ঞায়িত করতে হবে। Room ডাটাবেসে টেবিল তৈরি করতে এই টীকাযুক্ত ক্লাসগুলি ব্যবহার করে এবং ডাটাবেসের উপর কাজ করে এমন প্রশ্নগুলি।

ধাপ 1: SleepNight সত্তা তৈরি করুন

এই টাস্কে, আপনি একটি টীকাযুক্ত ডেটা ক্লাস হিসাবে এক রাতের ঘুমকে সংজ্ঞায়িত করেন।

এক রাতের ঘুমের জন্য, আপনাকে শুরুর সময়, শেষের সময় এবং একটি গুণমানের রেটিং রেকর্ড করতে হবে।

এবং রাতটিকে অনন্যভাবে সনাক্ত করতে আপনার একটি আইডি প্রয়োজন।

  1. database প্যাকেজে, SleepNight.kt ফাইলটি খুঁজুন এবং খুলুন।
  2. একটি আইডি, একটি শুরুর সময় (মিলিসেকেন্ডে), একটি শেষ সময় (মিলিসেকেন্ডে) এবং একটি সংখ্যাসূচক ঘুম-গুণমানের রেটিং সহ পরামিতি সহ SleepNight ডেটা ক্লাস তৈরি করুন৷
  • আপনাকে sleepQuality আরম্ভ করতে হবে, তাই এটিকে সেট করুন -1 , ইঙ্গিত করে যে কোনও গুণমান ডেটা সংগ্রহ করা হয়নি।
  • আপনাকে শেষ সময় শুরু করতে হবে। এখনও কোন শেষ সময় রেকর্ড করা হয়নি তা সংকেত দিতে এটি শুরুর সময় সেট করুন।
data class SleepNight(
       var nightId: Long = 0L,
       val startTimeMilli: Long = System.currentTimeMillis(),
       var endTimeMilli: Long = startTimeMilli,
       var sleepQuality: Int = -1
)
  1. ক্লাস ঘোষণার আগে, @Entity দিয়ে ডেটা ক্লাসটি টীকা করুন। daily_sleep_quality_table নাম দিন। tableName জন্য যুক্তি ঐচ্ছিক, কিন্তু প্রস্তাবিত. আপনি ডকুমেন্টেশনে অন্যান্য আর্গুমেন্ট দেখতে পারেন।

    অনুরোধ করা হলে, androidx লাইব্রেরি থেকে Entity এবং অন্যান্য সমস্ত টীকা আমদানি করুন।
@Entity(tableName = "daily_sleep_quality_table")
data class SleepNight(...)
  1. nightId কে প্রাথমিক কী হিসেবে চিহ্নিত করতে, @PrimaryKey এর সাথে nightId প্রপার্টি টীকা করুন। autoGenerate প্যারামিটারটিকে true সেট করুন যাতে Room প্রতিটি সত্তার জন্য আইডি তৈরি করে। এটি গ্যারান্টি দেয় যে প্রতিটি রাতের আইডি অনন্য।
@PrimaryKey(autoGenerate = true)
var nightId: Long = 0L,...
  1. @ColumnInfo দিয়ে অবশিষ্ট বৈশিষ্ট্যগুলি টীকা করুন। নীচে দেখানো হিসাবে প্যারামিটার ব্যবহার করে সম্পত্তির নাম কাস্টমাইজ করুন।
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "daily_sleep_quality_table")
data class SleepNight(
       @PrimaryKey(autoGenerate = true)
       var nightId: Long = 0L,

       @ColumnInfo(name = "start_time_milli")
       val startTimeMilli: Long = System.currentTimeMillis(),

       @ColumnInfo(name = "end_time_milli")
       var endTimeMilli: Long = startTimeMilli,

       @ColumnInfo(name = "quality_rating")
       var sleepQuality: Int = -1
)
  1. এতে কোন ত্রুটি নেই তা নিশ্চিত করতে আপনার কোড তৈরি করুন এবং চালান।

এই টাস্কে, আপনি একটি ডেটা অ্যাক্সেস অবজেক্ট (DAO) সংজ্ঞায়িত করেন। অ্যান্ড্রয়েডে, DAO ডাটাবেস সন্নিবেশ করা, মুছে ফেলা এবং আপডেট করার জন্য সুবিধাজনক পদ্ধতি সরবরাহ করে।

আপনি যখন একটি Room ডাটাবেস ব্যবহার করেন, তখন আপনি আপনার কোডে Kotlin ফাংশনগুলিকে সংজ্ঞায়িত করে এবং কল করে ডাটাবেসটি জিজ্ঞাসা করেন৷ এই কোটলিন ফাংশনগুলি এসকিউএল কোয়েরির মানচিত্র করে। আপনি টীকা ব্যবহার করে একটি DAO-তে সেই ম্যাপিংগুলি সংজ্ঞায়িত করেন এবং Room প্রয়োজনীয় কোড তৈরি করে।

আপনার ডাটাবেস অ্যাক্সেস করার জন্য একটি কাস্টম ইন্টারফেস সংজ্ঞায়িত হিসাবে একটি DAO মনে করুন।

সাধারণ ডাটাবেস অপারেশনের জন্য, Room লাইব্রেরি সুবিধাজনক টীকা প্রদান করে, যেমন @Insert , @Delete , এবং @Update । অন্য সব কিছুর জন্য, @Query টীকা আছে। আপনি SQLite দ্বারা সমর্থিত যেকোন প্রশ্ন লিখতে পারেন।

একটি অতিরিক্ত বোনাস হিসাবে, আপনি যখন অ্যান্ড্রয়েড স্টুডিওতে আপনার প্রশ্নগুলি তৈরি করেন, কম্পাইলার সিনট্যাক্স ত্রুটিগুলির জন্য আপনার SQL প্রশ্নগুলি পরীক্ষা করে।

ঘুমের রাতের স্লিপ-ট্র্যাকার ডাটাবেসের জন্য, আপনাকে নিম্নলিখিতগুলি করতে সক্ষম হতে হবে:

  • নতুন রাত ঢোকান
  • একটি শেষ সময় এবং একটি গুণমান রেটিং আপডেট করতে একটি বিদ্যমান রাত আপডেট করুন
  • এর চাবির উপর ভিত্তি করে একটি নির্দিষ্ট রাত পান
  • সমস্ত রাত পান , যাতে আপনি তাদের প্রদর্শন করতে পারেন।
  • সবচেয়ে সাম্প্রতিক রাত পান.
  • ডাটাবেসের সমস্ত এন্ট্রি মুছুন

ধাপ 1: স্লিপডেটাবেস DAO তৈরি করুন

  1. database প্যাকেজে, SleepDatabaseDao.kt খুলুন।
  2. লক্ষ্য করুন যে interface SleepDatabaseDao @Dao দিয়ে টীকা করা হয়েছে। সমস্ত DAO-কে @Dao কীওয়ার্ড দিয়ে টীকা করতে হবে।
@Dao
interface SleepDatabaseDao {}
  1. ইন্টারফেসের শরীরের ভিতরে, একটি @Insert টীকা যোগ করুন। @Insert এর নীচে, একটি insert() ফাংশন যোগ করুন যা Entity ক্লাস SleepNight একটি উদাহরণ নেয় তার যুক্তি হিসাবে।

    সেটাই। ডাটাবেসে SleepNight সন্নিবেশ করার জন্য Room প্রয়োজনীয় সমস্ত কোড তৈরি করবে। যখন আপনি আপনার Kotlin কোড থেকে insert() কল করেন, তখন Room ডাটাবেসে সত্তা সন্নিবেশ করার জন্য একটি SQL কোয়েরি চালায়। (দ্রষ্টব্য: আপনি যে কোনো ফাংশনকে কল করতে পারেন।)
@Insert
fun insert(night: SleepNight)
  1. একটি SleepNight জন্য একটি update() ফাংশন সহ একটি @Update টীকা যোগ করুন। যে সত্তাটি আপডেট করা হয়েছে সেটি হল সেই সত্তা যার কাছে পাস করা একটির মতো একই কী রয়েছে৷ আপনি সত্তার অন্যান্য বৈশিষ্ট্যগুলির কিছু বা সমস্ত আপডেট করতে পারেন৷
@Update
fun update(night: SleepNight)

অবশিষ্ট কার্যকারিতার জন্য কোন সুবিধাজনক টীকা নেই, তাই আপনাকে @Query টীকা ব্যবহার করতে হবে এবং SQLite প্রশ্নগুলি সরবরাহ করতে হবে।

  1. একটি get() ফাংশনের সাথে একটি @Query টীকা যোগ করুন যা একটি Long key নেয় যুক্তি এবং একটি শূন্য SleepNight ফেরত দেয়। আপনি একটি অনুপস্থিত প্যারামিটারের জন্য একটি ত্রুটি দেখতে পাবেন।
@Query
fun get(key: Long): SleepNight?
  1. ক্যোয়ারীটি টীকাটিতে স্ট্রিং প্যারামিটার হিসাবে সরবরাহ করা হয়। @Query এ একটি প্যারামিটার যোগ করুন। এটিকে একটি String তৈরি করুন যা একটি SQLite কোয়েরি।
  • daily_sleep_quality_table থেকে সব কলাম নির্বাচন করুন
  • WHERE nightId এর সাথে মেলে : key যুক্তি।

    লক্ষ্য করুন :key । আপনি ফাংশনে আর্গুমেন্ট উল্লেখ করতে কোয়েরিতে কোলন নোটেশন ব্যবহার করেন।
("SELECT * from daily_sleep_quality_table WHERE nightId = :key")
  1. daily_sleep_quality_table থেকে সবকিছু DELETE জন্য একটি clear() ফাংশন এবং একটি SQLite কোয়েরি সহ আরেকটি @Query যোগ করুন। এই ক্যোয়ারী টেবিল নিজেই মুছে দেয় না.

    @Delete টীকাটি একটি আইটেম মুছে দেয়, এবং আপনি @Delete ব্যবহার করতে পারেন এবং মুছে ফেলার জন্য রাতের একটি তালিকা সরবরাহ করতে পারেন। অপূর্ণতা হল যে আপনাকে টেবিলে কী আছে তা আনতে বা জানতে হবে। @Delete টীকাটি নির্দিষ্ট এন্ট্রি মুছে ফেলার জন্য দুর্দান্ত, কিন্তু একটি টেবিল থেকে সমস্ত এন্ট্রি মুছে ফেলার জন্য দক্ষ নয়।
@Query("DELETE FROM daily_sleep_quality_table")
fun clear()
  1. একটি getTonight() ফাংশন সহ একটি @Query যোগ করুন। getTonight() দ্বারা ফিরে আসা SleepNight বাতিলযোগ্য করে তুলুন, যাতে ফাংশনটি টেবিলটি খালি থাকলে তা পরিচালনা করতে পারে। (সারণীটি শুরুতে খালি, এবং ডেটা সাফ হওয়ার পরে।)

    ডাটাবেস থেকে "আজ রাত্রি" পেতে, একটি SQLite ক্যোয়ারী লিখুন যা nightId দ্বারা সাজানো ফলাফলের তালিকার প্রথম উপাদানটি অবরোহ ক্রমে প্রদান করে। শুধুমাত্র একটি উপাদান ফেরত দিতে LIMIT 1 ব্যবহার করুন।
@Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC LIMIT 1")
fun getTonight(): SleepNight?
  1. একটি getAllNights() ফাংশন সহ একটি @Query যোগ করুন:
  • SQLite ক্যোয়ারীকে daily_sleep_quality_table থেকে সমস্ত কলাম ফেরত দিতে বলুন, নিচের ক্রম অনুসারে।
  • getAllNights() LiveData হিসাবে SleepNight সত্তার একটি তালিকা ফেরত দিন। Room আপনার জন্য এই LiveData আপডেট করে রাখে, যার মানে আপনাকে শুধুমাত্র একবার স্পষ্টভাবে ডেটা পেতে হবে।
  • আপনাকে androidx.lifecycle.LiveData থেকে LiveData আমদানি করতে হতে পারে।
@Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC")
fun getAllNights(): LiveData<List<SleepNight>>
  1. যদিও আপনি কোনো দৃশ্যমান পরিবর্তন দেখতে পাবেন না, আপনার অ্যাপটি চালান যাতে কোনো ত্রুটি নেই।

এই টাস্কে, আপনি একটি Room ডাটাবেস তৈরি করেন যেটি Entity এবং DAO ব্যবহার করে যা আপনি আগের টাস্কে তৈরি করেছিলেন।

আপনাকে @Database এর সাথে টীকাযুক্ত একটি বিমূর্ত ডাটাবেস হোল্ডার ক্লাস তৈরি করতে হবে। এই ক্লাসের একটি পদ্ধতি রয়েছে যা হয় ডাটাবেসের একটি উদাহরণ তৈরি করে যদি ডাটাবেসটি বিদ্যমান না থাকে, অথবা একটি বিদ্যমান ডাটাবেসের একটি রেফারেন্স প্রদান করে।

একটি Room ডাটাবেস পাওয়া কিছুটা জড়িত, তাই কোড দিয়ে শুরু করার আগে এখানে সাধারণ প্রক্রিয়া রয়েছে:

  • একটি public abstract শ্রেণী তৈরি করুন যা extends RoomDatabase । এই ক্লাস একটি ডাটাবেস ধারক হিসাবে কাজ করা হয়. ক্লাসটি বিমূর্ত, কারণ Room আপনার জন্য বাস্তবায়ন তৈরি করে।
  • @Database দিয়ে ক্লাসটি টীকা করুন। আর্গুমেন্টে, ডাটাবেসের জন্য সত্তা ঘোষণা করুন এবং সংস্করণ নম্বর সেট করুন।
  • একটি companion বস্তুর ভিতরে, একটি বিমূর্ত পদ্ধতি বা সম্পত্তি সংজ্ঞায়িত করুন যা একটি SleepDatabaseDao প্রদান করে। Room আপনার জন্য বডি তৈরি করবে।
  • পুরো অ্যাপের জন্য আপনার শুধুমাত্র Room ডাটাবেসের একটি উদাহরণ প্রয়োজন, তাই RoomDatabase একটি সিঙ্গলটন করুন।
  • ডাটাবেসটি বিদ্যমান না থাকলে শুধুমাত্র ডাটাবেস তৈরি করতে Room ডাটাবেস নির্মাতা ব্যবহার করুন। অন্যথায়, বিদ্যমান ডাটাবেস ফেরত দিন।

ধাপ 1: ডাটাবেস তৈরি করুন

  1. database প্যাকেজে, SleepDatabase.kt খুলুন।
  2. ফাইলটিতে, SleepDatabase নামে একটি abstract ক্লাস তৈরি করুন যা RoomDatabase প্রসারিত করে।

    @Database দিয়ে ক্লাসটি টীকা করুন।
@Database()
abstract class SleepDatabase : RoomDatabase() {}
  1. আপনি অনুপস্থিত সত্তা এবং সংস্করণ পরামিতিগুলির জন্য একটি ত্রুটি দেখতে পাবেন। @Database টীকাটির জন্য বেশ কয়েকটি আর্গুমেন্ট প্রয়োজন, যাতে Room ডাটাবেস তৈরি করতে পারে।
  • entities তালিকা সহ একমাত্র আইটেম হিসাবে SleepNight সরবরাহ করুন।
  • version 1 হিসাবে সেট করুন যখনই আপনি স্কিমা পরিবর্তন করবেন, আপনাকে সংস্করণ নম্বর বাড়াতে হবে।
  • স্কিম সংস্করণ ইতিহাস ব্যাকআপ না রাখার জন্য, exportSchema false তে সেট করুন।
entities = [SleepNight::class], version = 1, exportSchema = false
  1. ডাটাবেস ডিএও সম্পর্কে জানতে হবে। ক্লাসের মূল অংশের ভিতরে, একটি বিমূর্ত মান ঘোষণা করুন যা SleepDatabaseDao প্রদান করে। আপনার একাধিক DAO থাকতে পারে।
abstract val sleepDatabaseDao: SleepDatabaseDao
  1. এর নীচে, একটি companion বস্তু সংজ্ঞায়িত করুন। সহচর অবজেক্ট ক্লায়েন্টদের ক্লাস ইনস্ট্যান্টিয়েট না করেই ডাটাবেস তৈরি বা পাওয়ার পদ্ধতিগুলি অ্যাক্সেস করতে দেয়। যেহেতু এই ক্লাসের একমাত্র উদ্দেশ্য একটি ডাটাবেস প্রদান করা, তাই এটিকে ইনস্ট্যান্টিয়েট করার কোন কারণ নেই।
 companion object {}
  1. companion বস্তুর ভিতরে, ডাটাবেসের জন্য একটি প্রাইভেট nullable পরিবর্তনশীল INSTANCE ঘোষণা করুন এবং এটিকে null এ আরম্ভ করুন। একবার তৈরি হয়ে গেলে INSTANCE ভেরিয়েবলটি ডাটাবেসের একটি রেফারেন্স রাখবে। এটি আপনাকে ডাটাবেসের সাথে বারবার সংযোগ খোলা এড়াতে সহায়তা করে, যা ব্যয়বহুল।

@Volatile এর সাথে INSTANCE টীকা করুন। একটি উদ্বায়ী ভেরিয়েবলের মান কখনই ক্যাশে করা হবে না এবং সমস্ত লেখা এবং পড়া প্রধান মেমরিতে এবং থেকে করা হবে। এটি নিশ্চিত করতে সাহায্য করে যে INSTANCE এর মান সর্বদা আপ-টু-ডেট এবং সমস্ত এক্সিকিউশন থ্রেডের জন্য একই। এর মানে হল যে একটি থ্রেড দ্বারা INSTANCE এ করা পরিবর্তনগুলি অন্যান্য সমস্ত থ্রেডে অবিলম্বে দৃশ্যমান হয়, এবং আপনি এমন পরিস্থিতি পাবেন না যেখানে, বলুন, দুটি থ্রেড প্রতিটি ক্যাশে একই সত্তা আপডেট করে, যা একটি সমস্যা তৈরি করবে।

@Volatile
private var INSTANCE: SleepDatabase? = null
  1. INSTANCE নীচে, এখনও companion বস্তুর ভিতরে, একটি Context প্যারামিটার সহ একটি getInstance() পদ্ধতি সংজ্ঞায়িত করুন যা ডাটাবেস নির্মাতার প্রয়োজন হবে। একটি টাইপ SleepDatabase রিটার্ন করুন। আপনি একটি ত্রুটি দেখতে পাবেন কারণ getInstance() এখনও কিছু ফেরত দিচ্ছে না।
fun getInstance(context: Context): SleepDatabase {}
  1. getInstance() এর ভিতরে, একটি synchronized{} ব্লক যোগ করুন। this পাস করুন যাতে আপনি প্রসঙ্গটি অ্যাক্সেস করতে পারেন।

    একাধিক থ্রেড সম্ভাব্যভাবে একই সময়ে একটি ডাটাবেস উদাহরণের জন্য জিজ্ঞাসা করতে পারে, যার ফলে একটির পরিবর্তে দুটি ডাটাবেস তৈরি হয়। এই নমুনা অ্যাপটিতে এই সমস্যাটি হওয়ার সম্ভাবনা নেই, তবে এটি আরও জটিল অ্যাপের জন্য সম্ভব। ডাটাবেসকে synchronized করার জন্য কোডটি মোড়ানোর মানে হল যে একবারে এক্সিকিউশনের শুধুমাত্র একটি থ্রেড কোডের এই ব্লকে প্রবেশ করতে পারে, যা নিশ্চিত করে যে ডাটাবেসটি শুধুমাত্র একবার শুরু হয়।
synchronized(this) {}
  1. সিঙ্ক্রোনাইজড ব্লকের ভিতরে, একটি স্থানীয় পরিবর্তনশীল instance INSTANCE এর বর্তমান মানটি অনুলিপি করুন। এটি স্মার্ট কাস্টের সুবিধা নেওয়ার জন্য, যা শুধুমাত্র স্থানীয় ভেরিয়েবলের জন্য উপলব্ধ।
var instance = INSTANCE
  1. synchronized ব্লকের ভিতরে, synchronized ব্লকের শেষে return instance । রিটার্ন টাইপ অমিল ত্রুটি উপেক্ষা করুন; একবার আপনি সম্পন্ন হলে আপনি কখনই শূন্য ফিরবেন না।
return instance
  1. return স্টেটমেন্টের উপরে, instance নাল কিনা তা পরীক্ষা করতে একটি if স্টেটমেন্ট যোগ করুন, অর্থাৎ এখনও কোন ডাটাবেস নেই।
if (instance == null) {}
  1. instance null হলে, একটি ডাটাবেস পেতে ডাটাবেস নির্মাতা ব্যবহার করুন। if স্টেটমেন্টের মূল অংশে, Room.databaseBuilder চালু করুন এবং আপনি যে প্রসঙ্গটি পাস করেছেন, ডাটাবেস ক্লাস এবং ডাটাবেসের জন্য একটি নাম, sleep_history_database সরবরাহ করুন। ত্রুটিটি সরাতে, আপনাকে একটি মাইগ্রেশন কৌশল যোগ করতে হবে এবং নিম্নলিখিত ধাপে build()
instance = Room.databaseBuilder(
                           context.applicationContext,
                           SleepDatabase::class.java,
                           "sleep_history_database")
  1. নির্মাতার কাছে প্রয়োজনীয় মাইগ্রেশন কৌশল যোগ করুন। .fallbackToDestructiveMigration() ব্যবহার করুন।

    সাধারণত, স্কিমা পরিবর্তনের জন্য আপনাকে একটি মাইগ্রেশন কৌশল সহ একটি মাইগ্রেশন অবজেক্ট প্রদান করতে হবে। একটি মাইগ্রেশন অবজেক্ট হল একটি অবজেক্ট যা সংজ্ঞায়িত করে যে আপনি কীভাবে পুরানো স্কিমার সাথে সমস্ত সারি গ্রহণ করবেন এবং সেগুলিকে নতুন স্কিমার সারিতে রূপান্তর করবেন, যাতে কোনও ডেটা হারিয়ে না যায়। মাইগ্রেশন এই কোডল্যাবের সুযোগের বাইরে। একটি সহজ সমাধান হল ডাটাবেস ধ্বংস এবং পুনর্নির্মাণ করা, যার অর্থ ডেটা হারিয়ে গেছে।
.fallbackToDestructiveMigration()
  1. অবশেষে, .build() কল করুন।
.build()
  1. if স্টেটমেন্টের ভিতরে চূড়ান্ত ধাপ হিসাবে INSTANCE = instance বরাদ্দ করুন।
INSTANCE = instance
  1. আপনার চূড়ান্ত কোড এই মত হওয়া উচিত:
@Database(entities = [SleepNight::class], version = 1, exportSchema = false)
abstract class SleepDatabase : RoomDatabase() {

   abstract val sleepDatabaseDao: SleepDatabaseDao

   companion object {

       @Volatile
       private var INSTANCE: SleepDatabase? = null

       fun getInstance(context: Context): SleepDatabase {
           synchronized(this) {
               var instance = INSTANCE

               if (instance == null) {
                   instance = Room.databaseBuilder(
                           context.applicationContext,
                           SleepDatabase::class.java,
                           "sleep_history_database"
                   )
                           .fallbackToDestructiveMigration()
                           .build()
                   INSTANCE = instance
               }
               return instance
           }
       }
   }
}
  1. আপনার কোড তৈরি করুন এবং চালান।

আপনার Room ডাটাবেসের সাথে কাজ করার জন্য আপনার কাছে এখন সমস্ত বিল্ডিং ব্লক রয়েছে। এই কোডটি কম্পাইল করে এবং রান করে, কিন্তু এটি আসলে কাজ করে কিনা তা বলার আপনার কোন উপায় নেই। সুতরাং, কিছু মৌলিক পরীক্ষা যোগ করার জন্য এটি একটি ভাল সময়।

ধাপ 2: স্লিপডেটাবেস পরীক্ষা করুন

এই ধাপে, আপনার ডাটাবেস কাজ করে কিনা তা যাচাই করতে আপনি প্রদত্ত পরীক্ষা চালান। এটি নিশ্চিত করতে সাহায্য করে যে ডাটাবেস আপনি এটিতে তৈরি করার আগে কাজ করে। প্রদত্ত পরীক্ষাগুলি মৌলিক। একটি প্রোডাকশন অ্যাপের জন্য, আপনি সমস্ত DAO-তে সমস্ত ফাংশন এবং প্রশ্নগুলি অনুশীলন করবেন।

স্টার্টার অ্যাপটিতে একটি androidTest ফোল্ডার রয়েছে। এই androidTest ফোল্ডারে ইউনিট পরীক্ষা রয়েছে যা অ্যান্ড্রয়েড ইন্সট্রুমেন্টেশন জড়িত, যা বলার একটি অভিনব উপায় যে পরীক্ষাগুলির জন্য Android ফ্রেমওয়ার্ক প্রয়োজন, তাই আপনাকে একটি শারীরিক বা ভার্চুয়াল ডিভাইসে পরীক্ষা চালাতে হবে। অবশ্যই, আপনি অ্যান্ড্রয়েড ফ্রেমওয়ার্কের সাথে জড়িত নয় এমন বিশুদ্ধ ইউনিট পরীক্ষাগুলি তৈরি এবং চালাতে পারেন।

  1. অ্যান্ড্রয়েড স্টুডিওতে, অ্যান্ড্রয়েডটেস্ট ফোল্ডারে, স্লিপডেটাবেসটেস্ট ফাইলটি খুলুন।
  2. কোডটি আনকমেন্ট করতে, মন্তব্য করা সমস্ত কোড নির্বাচন করুন এবং Cmd+/ বা Control+/ কীবোর্ড শর্টকাট টিপুন।
  3. ফাইলটা দেখে নিন।

এখানে টেস্টিং কোডের একটি দ্রুত রান-থ্রু রয়েছে, কারণ এটি কোডের আরেকটি অংশ যা আপনি পুনরায় ব্যবহার করতে পারেন:

  • SleepDabaseTest একটি পরীক্ষার ক্লাস
  • @RunWith টীকা পরীক্ষার রানারকে শনাক্ত করে, এটি এমন একটি প্রোগ্রাম যা পরীক্ষাগুলি সেট আপ করে এবং চালায়।
  • সেটআপের সময়, @Before সাথে টীকা করা ফাংশনটি কার্যকর করা হয় এবং এটি SleepDatabaseDao এর সাথে একটি ইন-মেমরি SleepDatabase তৈরি করে। "ইন-মেমরি" এর অর্থ হল এই ডাটাবেসটি ফাইল সিস্টেমে সংরক্ষিত নেই এবং পরীক্ষা চালানোর পরে মুছে ফেলা হবে।
  • এছাড়াও ইন-মেমরি ডাটাবেস তৈরি করার সময়, কোডটি অন্য একটি পরীক্ষা-নির্দিষ্ট পদ্ধতিতে কল করে, allowMainThreadQueries । ডিফল্টরূপে, আপনি যদি প্রধান থ্রেডে প্রশ্নগুলি চালানোর চেষ্টা করেন তবে আপনি একটি ত্রুটি পাবেন। এই পদ্ধতিটি আপনাকে মূল থ্রেডে পরীক্ষা চালানোর অনুমতি দেয়, যা আপনার শুধুমাত্র পরীক্ষার সময় করা উচিত।
  • @Test এর সাথে টীকাযুক্ত একটি পরীক্ষা পদ্ধতিতে, আপনি একটি SleepNight তৈরি করেন, সন্নিবেশ করেন এবং পুনরুদ্ধার করেন এবং দাবি করেন যে সেগুলি একই। কিছু ভুল হলে, একটি ব্যতিক্রম নিক্ষেপ. একটি বাস্তব পরীক্ষায়, আপনার একাধিক @Test হবে পদ্ধতি
  • যখন পরীক্ষা করা হয়, তখন ডাটাবেস বন্ধ করার জন্য @After এক্সিকিউট দিয়ে ফাংশনটি টীকা করা হয়।
  1. প্রজেক্ট প্যানে টেস্ট ফাইলে ডান-ক্লিক করুন এবং 'SleepDatabaseTest' চালান নির্বাচন করুন।
  2. পরীক্ষাগুলি চালানোর পরে, SleepDatabaseTest প্যানে যাচাই করুন যে সমস্ত পরীক্ষা পাস হয়েছে।

যেহেতু সমস্ত পরীক্ষা পাস হয়েছে, আপনি এখন বেশ কিছু জিনিস জানেন:

  • ডাটাবেস সঠিকভাবে তৈরি করা হয়।
  • আপনি ডাটাবেসে একটি SleepNight সন্নিবেশ করতে পারেন।
  • আপনি SleepNight ফিরে পেতে পারেন.
  • মানের জন্য SleepNight সঠিক মান আছে.

অ্যান্ড্রয়েড স্টুডিও প্রকল্প: TrackMySleepQualityRoomAndTesting

একটি ডাটাবেস পরীক্ষা করার সময়, আপনাকে DAO-তে সংজ্ঞায়িত সমস্ত পদ্ধতি অনুশীলন করতে হবে। পরীক্ষা সম্পূর্ণ করতে , অন্যান্য DAO পদ্ধতিগুলি অনুশীলন করার জন্য পরীক্ষাগুলি যোগ করুন এবং চালান।

  • @Entity দিয়ে টীকা করা ডেটা ক্লাস হিসাবে আপনার টেবিলগুলিকে সংজ্ঞায়িত করুন। সারণিতে কলাম হিসাবে @ColumnInfo দিয়ে টীকাযুক্ত বৈশিষ্ট্যগুলিকে সংজ্ঞায়িত করুন।
  • @Dao সাথে টীকাযুক্ত একটি ইন্টারফেস হিসাবে একটি ডেটা অ্যাক্সেস অবজেক্ট (DAO) সংজ্ঞায়িত করুন। DAO ডাটাবেস প্রশ্নে Kotlin ফাংশন ম্যাপ করে।
  • @Insert , @Delete , এবং @Update ফাংশন সংজ্ঞায়িত করতে টীকা ব্যবহার করুন।
  • অন্য কোন প্রশ্নের জন্য একটি পরামিতি হিসাবে একটি SQLite ক্যোয়ারী স্ট্রিং সহ @Query টীকা ব্যবহার করুন।
  • একটি বিমূর্ত ক্লাস তৈরি করুন যাতে একটি getInstance() ফাংশন থাকে যা একটি ডাটাবেস প্রদান করে।
  • আপনার ডাটাবেস এবং DAO প্রত্যাশিত হিসাবে কাজ করছে তা পরীক্ষা করার জন্য যন্ত্রযুক্ত পরীক্ষাগুলি ব্যবহার করুন। আপনি একটি টেমপ্লেট হিসাবে প্রদত্ত পরীক্ষা ব্যবহার করতে পারেন.

উদাসীনতা কোর্স:

অ্যান্ড্রয়েড ডেভেলপার ডকুমেন্টেশন:

অন্যান্য ডকুমেন্টেশন এবং নিবন্ধ:

এই বিভাগে একজন প্রশিক্ষকের নেতৃত্বে একটি কোর্সের অংশ হিসাবে এই কোডল্যাবের মাধ্যমে কাজ করা শিক্ষার্থীদের জন্য সম্ভাব্য হোমওয়ার্ক অ্যাসাইনমেন্ট তালিকাভুক্ত করা হয়েছে। নিম্নলিখিতগুলি করা প্রশিক্ষকের উপর নির্ভর করে:

  • প্রয়োজনে হোমওয়ার্ক বরাদ্দ করুন।
  • শিক্ষার্থীদের সাথে যোগাযোগ করুন কিভাবে হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিতে হয়।
  • হোমওয়ার্ক অ্যাসাইনমেন্ট গ্রেড.

প্রশিক্ষকরা এই পরামর্শগুলি যতটা কম বা যতটা চান ততটা ব্যবহার করতে পারেন, এবং তাদের উপযুক্ত মনে করে অন্য কোনও হোমওয়ার্ক বরাদ্দ করতে নির্দ্বিধায় করা উচিত।

আপনি যদি নিজে থেকে এই কোডল্যাবের মাধ্যমে কাজ করে থাকেন, তাহলে আপনার জ্ঞান পরীক্ষা করার জন্য এই হোমওয়ার্ক অ্যাসাইনমেন্টগুলিকে নির্দ্বিধায় ব্যবহার করুন৷

এই প্রশ্নগুলোর উত্তর দাও

প্রশ্ন 1

আপনি কিভাবে নির্দেশ করেন যে একটি শ্রেণী একটি Room ডাটাবেসে সংরক্ষণ করার জন্য একটি সত্তাকে প্রতিনিধিত্ব করে?

  • ক্লাস প্রসারিত করুন DatabaseEntity .
  • @Entity দিয়ে ক্লাসটি টীকা করুন।
  • @Database দিয়ে ক্লাসটি টীকা করুন।
  • ক্লাসটি RoomEntity প্রসারিত করুন এবং @Room সাথে ক্লাসটি টীকা করুন।

প্রশ্ন 2

DAO (ডেটা অ্যাক্সেস অবজেক্ট) হল একটি ইন্টারফেস যা Room ডাটাবেস কোয়েরির জন্য Kotlin ফাংশন ম্যাপ করতে ব্যবহার করে।

আপনি কিভাবে নির্দেশ করেন যে একটি ইন্টারফেস একটি Room ডাটাবেসের জন্য একটি DAO প্রতিনিধিত্ব করে?

  • ইন্টারফেস প্রসারিত করুন RoomDAO .
  • ইন্টারফেসটি EntityDao প্রসারিত করুন, তারপরে DaoConnection() পদ্ধতি প্রয়োগ করুন।
  • @Dao এর সাথে ইন্টারফেসটি টীকা করুন।
  • @RoomConnection সাথে ইন্টারফেসটি টীকা করুন।

প্রশ্ন 3

নিচের কোন বিবৃতি Room ডাটাবেস সম্পর্কে সত্য? প্রযোজ্য সব চয়ন করুন.

  • আপনি একটি Room ডাটাবেসের জন্য টেবিলগুলিকে টীকাযুক্ত ডেটা ক্লাস হিসাবে সংজ্ঞায়িত করতে পারেন।
  • আপনি যদি একটি ক্যোয়ারী থেকে LiveData ফেরত দেন, LiveData পরিবর্তন হলে Room আপনার জন্য LiveData আপডেট রাখবে।
  • প্রতিটি Room ডাটাবেসের একটি এবং শুধুমাত্র একটি, DAO থাকতে হবে।
  • একটি শ্রেণীকে Room ডাটাবেস হিসাবে চিহ্নিত করতে, এটিকে RoomDatabase একটি সাবক্লাস করুন এবং এটিকে @Database দিয়ে টীকা করুন।

প্রশ্ন 4

নিচের কোন টীকাটি আপনি আপনার @Dao ইন্টারফেসে ব্যবহার করতে পারেন? প্রযোজ্য সব চয়ন করুন.

  • @Get
  • @Update
  • @Insert
  • @Query

প্রশ্ন 5

কিভাবে আপনি যাচাই করতে পারেন যে আপনার ডাটাবেস কাজ করছে? প্রযোজ্য সব নির্বাচন করুন.

  • যন্ত্রযুক্ত পরীক্ষা লিখুন।
  • এটি ডেটা প্রদর্শন না হওয়া পর্যন্ত অ্যাপটি লেখা এবং চালানো চালিয়ে যান।
  • Entity ক্লাসের সমতুল্য পদ্ধতিতে কল করে DAO ইন্টারফেসের পদ্ধতিতে কলগুলি প্রতিস্থাপন করুন।
  • Room লাইব্রেরি দ্বারা প্রদত্ত verifyDatabase() ফাংশনটি চালান।

পরবর্তী পাঠ শুরু করুন: 6.2 Coroutines এবং রুম

এই কোর্সে অন্যান্য কোডল্যাবগুলির লিঙ্কগুলির জন্য, Android Kotlin Fundamentals codelabs ল্যান্ডিং পৃষ্ঠাটি দেখুন।

,

এই কোডল্যাবটি অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোর্সের অংশ। আপনি যদি ক্রমানুসারে কোডল্যাবগুলির মাধ্যমে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন৷ সমস্ত কোর্স কোডল্যাব অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টাল কোডল্যাব ল্যান্ডিং পৃষ্ঠায় তালিকাভুক্ত করা হয়েছে।

ভূমিকা

ব্যবহারকারী অ্যাপটি বন্ধ করার পরেও বেশিরভাগ অ্যাপে ডেটা রাখা দরকার। উদাহরণস্বরূপ, অ্যাপটি একটি প্লেলিস্ট, গেম আইটেমগুলির একটি তালিকা, খরচ এবং আয়ের রেকর্ড, নক্ষত্রপুঞ্জের একটি ক্যাটালগ বা সময়ের সাথে সাথে ঘুমের ডেটা সংরক্ষণ করতে পারে। সাধারণত, আপনি অবিরাম ডেটা সঞ্চয় করার জন্য একটি ডাটাবেস ব্যবহার করবেন।

Room হল একটি ডাটাবেস লাইব্রেরি যা Android Jetpack- এর অংশ। Room একটি ডাটাবেস সেট আপ এবং কনফিগার করার অনেক কাজের যত্ন নেয় এবং আপনার অ্যাপের জন্য সাধারণ ফাংশন কল ব্যবহার করে ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করা সম্ভব করে তোলে। হুডের নীচে, Room হল একটি SQLite ডাটাবেসের উপরে একটি বিমূর্ত স্তর। Room পরিভাষা, এবং আরও জটিল প্রশ্নের জন্য ক্যোয়ারী সিনট্যাক্স, SQLite মডেল অনুসরণ করুন।

নীচের চিত্রটি দেখায় যে এই কোর্সে প্রস্তাবিত সামগ্রিক আর্কিটেকচারের সাথে Room ডাটাবেস কীভাবে ফিট করে।

আপনি ইতিমধ্যে কি জানা উচিত

আপনার সাথে পরিচিত হওয়া উচিত:

  • একটি Android অ্যাপের জন্য একটি মৌলিক ব্যবহারকারী ইন্টারফেস (UI) তৈরি করা
  • কার্যকলাপ, টুকরা, এবং দৃশ্য ব্যবহার করে।
  • টুকরোগুলির মধ্যে নেভিগেট করা এবং টুকরোগুলির মধ্যে ডেটা পাস করতে সেফ আর্গস (একটি গ্রেডল প্লাগইন) ব্যবহার করে।
  • মডেল, ভিউ-মডেল কারখানা, এবং LiveData এবং এর পর্যবেক্ষক দেখুন। এই আর্কিটেকচার কম্পোনেন্ট বিষয়গুলি এই কোর্সে একটি আগের কোডল্যাবে কভার করা হয়েছে।
  • SQL ডাটাবেস এবং SQLite ভাষার একটি প্রাথমিক ধারণা। একটি দ্রুত ওভারভিউ বা রিফ্রেশার জন্য SQLite প্রাইমার দেখুন।

আপনি কি শিখবেন

  • ডেটা বজায় রাখার জন্য কীভাবে একটি Room ডাটাবেস তৈরি এবং ইন্টারঅ্যাক্ট করবেন।
  • ডাটাবেসের একটি টেবিল সংজ্ঞায়িত করে এমন একটি ডেটা ক্লাস কীভাবে তৈরি করবেন।
  • এসকিউএল কোয়েরিতে কোটলিন ফাংশন ম্যাপ করতে ডেটা অ্যাক্সেস অবজেক্ট (DAO) কীভাবে ব্যবহার করবেন।
  • আপনার ডাটাবেস কাজ করছে কিনা তা কীভাবে পরীক্ষা করবেন।

আপনি কি করবেন

  • রাতের ঘুমের ডেটার জন্য একটি ইন্টারফেস সহ একটি Room ডাটাবেস তৈরি করুন।
  • প্রদত্ত পরীক্ষাগুলি ব্যবহার করে ডাটাবেস পরীক্ষা করুন।

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

অ্যাপটিতে দুটি স্ক্রীন রয়েছে, যা খন্ড দ্বারা উপস্থাপিত হয়েছে, যেমনটি নীচের চিত্রে দেখানো হয়েছে।

বাম দিকে দেখানো প্রথম স্ক্রিনে ট্র্যাকিং শুরু এবং বন্ধ করার জন্য বোতাম রয়েছে৷ স্ক্রিনটি ব্যবহারকারীর ঘুমের সমস্ত ডেটা দেখায়। ক্লিয়ার বোতামটি স্থায়ীভাবে সমস্ত ডেটা মুছে দেয় যা অ্যাপ ব্যবহারকারীর জন্য সংগ্রহ করেছে।

দ্বিতীয় স্ক্রীন, ডানদিকে দেখানো হয়েছে, ঘুমের মানের রেটিং নির্বাচন করার জন্য। অ্যাপে, রেটিংটি সংখ্যাগতভাবে উপস্থাপন করা হয়। বিকাশের উদ্দেশ্যে, অ্যাপটি মুখের আইকন এবং তাদের সংখ্যাসূচক সমতুল্য উভয়ই দেখায়।

ব্যবহারকারীর প্রবাহ নিম্নরূপ:

  • ব্যবহারকারী অ্যাপটি খোলে এবং স্লিপ-ট্র্যাকিং স্ক্রিন দিয়ে উপস্থাপিত হয়।
  • ব্যবহারকারী স্টার্ট বোতামে ট্যাপ করে। এটি শুরুর সময় রেকর্ড করে এবং এটি প্রদর্শন করে। স্টার্ট বোতামটি নিষ্ক্রিয় করা হয়েছে এবং স্টপ বোতামটি সক্রিয় করা হয়েছে।
  • ব্যবহারকারী স্টপ বোতামে ট্যাপ করে। এটি শেষের সময় রেকর্ড করে এবং ঘুমের মানের স্ক্রিন খোলে।
  • ব্যবহারকারী একটি ঘুমের মানের আইকন নির্বাচন করে। স্ক্রিন বন্ধ হয়ে যায়, এবং ট্র্যাকিং স্ক্রীন ঘুমের শেষ সময় এবং ঘুমের গুণমান প্রদর্শন করে। স্টপ বোতামটি নিষ্ক্রিয় করা হয়েছে এবং স্টার্ট বোতামটি সক্ষম করা হয়েছে। অ্যাপটি অন্য রাতের জন্য প্রস্তুত।
  • যখনই ডাটাবেসে ডেটা থাকে তখন ক্লিয়ার বোতামটি সক্রিয় থাকে। ব্যবহারকারী যখন ক্লিয়ার বোতামে আলতো চাপেন, তখন তাদের সমস্ত ডেটা অবলম্বন ছাড়াই মুছে ফেলা হয় — সেখানে "আপনি কি নিশ্চিত?" বার্তা

এই অ্যাপটি একটি সরলীকৃত আর্কিটেকচার ব্যবহার করে, যেমনটি সম্পূর্ণ আর্কিটেকচারের প্রসঙ্গে নীচে দেখানো হয়েছে। অ্যাপ্লিকেশন শুধুমাত্র নিম্নলিখিত উপাদান ব্যবহার করে:

  • UI কন্ট্রোলার
  • মডেল এবং LiveData দেখুন
  • একটি রুম ডাটাবেস

ধাপ 1: স্টার্টার অ্যাপটি ডাউনলোড করুন এবং চালান

  1. GitHub থেকে TrackMySleepQuality-Starter অ্যাপটি ডাউনলোড করুন।
  2. অ্যাপটি তৈরি করুন এবং চালান। অ্যাপটি SleepTrackerFragment খণ্ডের জন্য UI দেখায়, কিন্তু কোনো ডেটা নেই। বোতামগুলি ট্যাপগুলিতে সাড়া দেয় না।

ধাপ 2: স্টার্টার অ্যাপটি পরিদর্শন করুন

  1. Gradle ফাইলগুলি একবার দেখুন:
  • প্রকল্প Gradle ফাইল
    প্রকল্প-স্তরের build.gradle ফাইলে, লাইব্রেরি সংস্করণ নির্দিষ্ট করে এমন ভেরিয়েবলগুলি লক্ষ্য করুন। স্টার্টার অ্যাপে ব্যবহৃত সংস্করণগুলি একসাথে ভাল কাজ করে এবং এই অ্যাপের সাথে ভাল কাজ করে। আপনি এই কোডল্যাবটি শেষ করার সময়, Android স্টুডিও আপনাকে কিছু সংস্করণ আপডেট করার জন্য অনুরোধ করতে পারে। আপনি অ্যাপটিতে থাকা সংস্করণগুলি আপডেট করতে চান বা থাকতে চান তা আপনার উপর নির্ভর করে। আপনি যদি "অদ্ভুত" সংকলন ত্রুটির মধ্যে পড়েন, তাহলে চূড়ান্ত সমাধান অ্যাপ ব্যবহার করে এমন লাইব্রেরি সংস্করণগুলির সংমিশ্রণ ব্যবহার করার চেষ্টা করুন।
  • মডিউল গ্রেডল ফাইল। Room সহ সমস্ত অ্যান্ড্রয়েড জেটপ্যাক লাইব্রেরির জন্য প্রদত্ত নির্ভরতা এবং কোরোটিনের নির্ভরতাগুলি লক্ষ্য করুন৷
  1. প্যাকেজ এবং UI দেখে নিন। অ্যাপটি কার্যকারিতা দ্বারা গঠিত। প্যাকেজটিতে স্থানধারক ফাইল রয়েছে যেখানে আপনি কোডল্যাবগুলির এই সিরিজ জুড়ে কোড যোগ করবেন।
  • ডাটাবেস প্যাকেজ , Room ডাটাবেসের সাথে সম্পর্কিত সমস্ত কোডের জন্য database
  • স্লিপ sleepquality এবং sleeptracker প্যাকেজগুলিতে প্রতিটি স্ক্রিনের জন্য ফ্র্যাগমেন্ট, ভিউ মডেল এবং মডেল ফ্যাক্টরি রয়েছে।
  1. Util.kt ফাইলটি দেখুন, যেটিতে ঘুমের মানের ডেটা প্রদর্শন করতে সাহায্য করার জন্য ফাংশন রয়েছে। কিছু কোড মন্তব্য করা হয়েছে কারণ এটি একটি ভিউ মডেল উল্লেখ করে যা আপনি পরে তৈরি করেন।
  2. androidTest ফোল্ডারটি দেখুন ( SleepDatabaseTest.kt )। ডাটাবেসটি উদ্দেশ্য অনুযায়ী কাজ করে তা যাচাই করতে আপনি এই পরীক্ষাটি ব্যবহার করবেন।

অ্যান্ড্রয়েডে, ডেটা ক্লাসে উপস্থাপিত হয় এবং ফাংশন কল ব্যবহার করে ডেটা অ্যাক্সেস এবং পরিবর্তন করা হয়। যাইহোক, ডাটাবেস জগতে, আপনার সত্তা এবং প্রশ্নগুলির প্রয়োজন।

  • একটি সত্তা একটি বস্তু বা ধারণার প্রতিনিধিত্ব করে, এবং এর বৈশিষ্ট্যগুলিকে ডাটাবেসে সংরক্ষণ করে। একটি সত্তা ক্লাস একটি টেবিল সংজ্ঞায়িত করে, এবং সেই শ্রেণীর প্রতিটি উদাহরণ টেবিলের একটি সারি প্রতিনিধিত্ব করে। প্রতিটি সম্পত্তি একটি কলাম সংজ্ঞায়িত করে। আপনার অ্যাপে, সত্তা একটি রাতের ঘুমের তথ্য ধারণ করতে চলেছে।
  • একটি ক্যোয়ারী একটি ডাটাবেস টেবিল বা টেবিলের সংমিশ্রণ থেকে ডেটা বা তথ্যের জন্য একটি অনুরোধ, বা ডেটার উপর একটি ক্রিয়া সম্পাদন করার অনুরোধ। সাধারণ প্রশ্ন হল সত্ত্বা পাওয়ার, সন্নিবেশ করা এবং আপডেট করার জন্য। উদাহরণস্বরূপ, আপনি রেকর্ডে থাকা সমস্ত ঘুমের রাতের জন্য জিজ্ঞাসা করতে পারেন, শুরুর সময় অনুসারে সাজানো।

Kotlin ডেটা ক্লাস থেকে SQLite টেবিলে সংরক্ষণ করা যেতে পারে এমন সত্তা এবং ফাংশন ঘোষণা থেকে SQL কোয়েরি পর্যন্ত পেতে Room আপনার জন্য সমস্ত কঠোর পরিশ্রম করে।

আপনাকে অবশ্যই প্রতিটি সত্তাকে একটি টীকাযুক্ত ডেটা ক্লাস হিসাবে এবং ইন্টারঅ্যাকশনগুলিকে একটি টীকাযুক্ত ইন্টারফেস, একটি ডেটা অ্যাক্সেস অবজেক্ট (DAO) হিসাবে সংজ্ঞায়িত করতে হবে। Room ডাটাবেসে টেবিল তৈরি করতে এই টীকাযুক্ত ক্লাসগুলি ব্যবহার করে এবং ডাটাবেসের উপর কাজ করে এমন প্রশ্নগুলি।

ধাপ 1: SleepNight সত্তা তৈরি করুন

এই টাস্কে, আপনি একটি টীকাযুক্ত ডেটা ক্লাস হিসাবে এক রাতের ঘুমকে সংজ্ঞায়িত করেন।

এক রাতের ঘুমের জন্য, আপনাকে শুরুর সময়, শেষের সময় এবং একটি গুণমানের রেটিং রেকর্ড করতে হবে।

এবং রাতটিকে অনন্যভাবে সনাক্ত করতে আপনার একটি আইডি প্রয়োজন।

  1. database প্যাকেজে, SleepNight.kt ফাইলটি খুঁজুন এবং খুলুন।
  2. একটি আইডি, একটি শুরুর সময় (মিলিসেকেন্ডে), একটি শেষ সময় (মিলিসেকেন্ডে) এবং একটি সংখ্যাসূচক ঘুম-গুণমানের রেটিং সহ পরামিতি সহ SleepNight ডেটা ক্লাস তৈরি করুন৷
  • আপনাকে sleepQuality আরম্ভ করতে হবে, তাই এটিকে সেট করুন -1 , ইঙ্গিত করে যে কোনও গুণমান ডেটা সংগ্রহ করা হয়নি।
  • আপনাকে শেষ সময় শুরু করতে হবে। এখনও কোন শেষ সময় রেকর্ড করা হয়নি তা সংকেত দিতে এটি শুরুর সময় সেট করুন।
data class SleepNight(
       var nightId: Long = 0L,
       val startTimeMilli: Long = System.currentTimeMillis(),
       var endTimeMilli: Long = startTimeMilli,
       var sleepQuality: Int = -1
)
  1. ক্লাস ঘোষণার আগে, @Entity দিয়ে ডেটা ক্লাসটি টীকা করুন। daily_sleep_quality_table নাম দিন। tableName জন্য যুক্তি ঐচ্ছিক, কিন্তু প্রস্তাবিত. আপনি ডকুমেন্টেশনে অন্যান্য আর্গুমেন্ট দেখতে পারেন।

    অনুরোধ করা হলে, androidx লাইব্রেরি থেকে Entity এবং অন্যান্য সমস্ত টীকা আমদানি করুন।
@Entity(tableName = "daily_sleep_quality_table")
data class SleepNight(...)
  1. nightId প্রাথমিক কী হিসাবে চিহ্নিত করতে, @PrimaryKey দিয়ে nightId সম্পত্তিটি টিকা দিন। প্যারামিটারটি autoGenerate true সেট করুন যাতে Room প্রতিটি সত্তার জন্য আইডি তৈরি করে। এটি গ্যারান্টি দেয় যে প্রতিটি রাতের জন্য আইডি অনন্য।
@PrimaryKey(autoGenerate = true)
var nightId: Long = 0L,...
  1. @ColumnInfo দিয়ে অবশিষ্ট বৈশিষ্ট্যগুলি টীকা দিন। নীচে প্রদর্শিত হিসাবে পরামিতি ব্যবহার করে সম্পত্তির নামগুলি কাস্টমাইজ করুন।
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "daily_sleep_quality_table")
data class SleepNight(
       @PrimaryKey(autoGenerate = true)
       var nightId: Long = 0L,

       @ColumnInfo(name = "start_time_milli")
       val startTimeMilli: Long = System.currentTimeMillis(),

       @ColumnInfo(name = "end_time_milli")
       var endTimeMilli: Long = startTimeMilli,

       @ColumnInfo(name = "quality_rating")
       var sleepQuality: Int = -1
)
  1. এটির কোনও ত্রুটি নেই তা নিশ্চিত করার জন্য আপনার কোডটি তৈরি করুন এবং চালান।

এই কার্যক্রমে, আপনি একটি ডেটা অ্যাক্সেস অবজেক্ট (ডিএও) সংজ্ঞায়িত করেছেন। অ্যান্ড্রয়েডে, ডিএও ডাটাবেস সন্নিবেশ, মোছা এবং আপডেট করার জন্য সুবিধার্থে পদ্ধতি সরবরাহ করে।

আপনি যখন কোনও Room ডাটাবেস ব্যবহার করেন, আপনি আপনার কোডে কোটলিন ফাংশনগুলি সংজ্ঞায়িত করে এবং কল করে ডাটাবেসটি জিজ্ঞাসা করুন। এই কোটলিন ফাংশনগুলি এসকিউএল কোয়েরিতে মানচিত্র করে। আপনি টীকাগুলি ব্যবহার করে একটি ডিএওতে সেই ম্যাপিংগুলি সংজ্ঞায়িত করেন এবং Room প্রয়োজনীয় কোড তৈরি করে।

আপনার ডাটাবেস অ্যাক্সেসের জন্য একটি কাস্টম ইন্টারফেস সংজ্ঞায়িত হিসাবে কোনও ডিএওকে ভাবেন।

সাধারণ ডাটাবেস অপারেশনগুলির জন্য, Room লাইব্রেরিটি @Insert , @Delete এবং @Update মতো সুবিধার্থে টীকাগুলি সরবরাহ করে। অন্য সব কিছুর জন্য, @Query টীকা রয়েছে। আপনি এসকিউএলাইট দ্বারা সমর্থিত যে কোনও ক্যোয়ারী লিখতে পারেন।

একটি যুক্ত বোনাস হিসাবে, আপনি অ্যান্ড্রয়েড স্টুডিওতে আপনার প্রশ্নগুলি তৈরি করার সাথে সাথে সংকলকটি সিনট্যাক্স ত্রুটির জন্য আপনার এসকিউএল কোয়েরিগুলি পরীক্ষা করে।

ঘুমের রাতের স্লিপ-ট্র্যাকার ডাটাবেসের জন্য, আপনাকে নিম্নলিখিতগুলি করতে সক্ষম হতে হবে:

  • নতুন রাত .োকান
  • একটি শেষ সময় এবং একটি মানের রেটিং আপডেট করতে একটি বিদ্যমান রাত আপডেট করুন
  • এর কী ভিত্তিক একটি নির্দিষ্ট রাত পান
  • সমস্ত রাত পান , যাতে আপনি সেগুলি প্রদর্শন করতে পারেন।
  • সর্বাধিক সাম্প্রতিক রাত পান।
  • ডাটাবেসে সমস্ত এন্ট্রি মুছুন

পদক্ষেপ 1: স্লিপডাটাবেস দাও তৈরি করুন

  1. database প্যাকেজে, SleepDatabaseDao.kt খুলুন।
  2. লক্ষ্য করুন যে interface SleepDatabaseDao @Dao দিয়ে টীকাযুক্ত। সমস্ত ডিএওএস @Dao কীওয়ার্ড দিয়ে টীকা দেওয়া দরকার।
@Dao
interface SleepDatabaseDao {}
  1. ইন্টারফেসের দেহের অভ্যন্তরে, একটি @Insert টীকা যুক্ত করুন। @Insert ইনসার্টের নীচে, একটি insert() ফাংশন যুক্ত করুন যা Entity শ্রেণীর SleepNight উদাহরণ নেয় তার যুক্তি হিসাবে।

    সেটাই। Room ডাটাবেসে SleepNight সন্নিবেশ করতে সমস্ত প্রয়োজনীয় কোড তৈরি করবে। আপনি যখন আপনার কোটলিন কোড থেকে insert() কল করেন, তখন Room সত্তাকে ডাটাবেসে সন্নিবেশ করতে একটি এসকিউএল ক্যোয়ারী কার্যকর করে। (দ্রষ্টব্য: আপনি ফাংশনটিকে আপনার পছন্দমতো কল করতে পারেন))
@Insert
fun insert(night: SleepNight)
  1. এক SleepNight জন্য update() ফাংশন সহ একটি @Update টীকা যুক্ত করুন। যে সত্তা আপডেট হয়েছে তা হ'ল সত্তা যা পাশের মতো একই কী রয়েছে You আপনি সত্তার অন্যান্য বৈশিষ্ট্যগুলির কিছু বা সমস্ত আপডেট করতে পারেন।
@Update
fun update(night: SleepNight)

অবশিষ্ট কার্যকারিতার জন্য কোনও সুবিধার্থে টীকা নেই, সুতরাং আপনাকে @Query টীকাটি ব্যবহার করতে হবে এবং এসকিউএলাইট কোয়েরি সরবরাহ করতে হবে।

  1. একটি get() ফাংশন সহ একটি @Query টীকা যুক্ত করুন যা একটি Long key নেয় যুক্তি এবং একটি শূন্যস্থান SleepNight ফিরে। আপনি অনুপস্থিত প্যারামিটারের জন্য একটি ত্রুটি দেখতে পাবেন।
@Query
fun get(key: Long): SleepNight?
  1. ক্যোয়ারীটি টীকাটির স্ট্রিং প্যারামিটার হিসাবে সরবরাহ করা হয়। @Query কিউয়েরিতে একটি প্যারামিটার যুক্ত করুন। এটি একটি String তৈরি করুন যা একটি স্ক্লাইট ক্যোয়ারী।
  • daily_sleep_quality_table থেকে সমস্ত কলাম নির্বাচন করুন
  • WHERE nightId মেলে: key যুক্তি।

    লক্ষ্য করুন :key । আপনি ফাংশনটিতে রেফারেন্স যুক্তিগুলির জন্য কোয়েরিতে কোলন স্বরলিপি ব্যবহার করেন।
("SELECT * from daily_sleep_quality_table WHERE nightId = :key")
  1. daily_sleep_quality_table থেকে সমস্ত কিছু DELETE একটি clear() ফাংশন এবং একটি স্ক্লাইট ক্যোয়ারী সহ আরও একটি @Query যুক্ত করুন। এই ক্যোয়ারী নিজেই টেবিলটি মুছবে না।

    @Delete টীকাটি একটি আইটেম মুছে দেয় এবং আপনি @Delete ব্যবহার করতে পারেন এবং মুছতে রাতের একটি তালিকা সরবরাহ করতে পারেন। অপূর্ণতাটি হ'ল আপনাকে টেবিলে কী আছে তা আনতে বা জানতে হবে। @Delete টীকাগুলি নির্দিষ্ট এন্ট্রিগুলি মুছে ফেলার জন্য দুর্দান্ত, তবে কোনও টেবিল থেকে সমস্ত এন্ট্রি সাফ করার জন্য দক্ষ নয়।
@Query("DELETE FROM daily_sleep_quality_table")
fun clear()
  1. একটি getTonight() ফাংশন সহ একটি @Query যুক্ত করুন। getTonight() নালযোগ্য দ্বারা ফিরে SleepNight তৈরি করুন, যাতে ফাংশনটি যেখানে টেবিলটি খালি রয়েছে সেখানে কেসটি পরিচালনা করতে পারে। (টেবিলটি শুরুতে খালি, এবং ডেটা সাফ হওয়ার পরে))

    ডাটাবেস থেকে "আজ রাতে" পেতে, একটি স্ক্লাইট ক্যোয়ারী লিখুন যা অবতরণ ক্রমে nightId দ্বারা আদেশিত ফলাফলের তালিকার প্রথম উপাদানটি ফিরিয়ে দেয়। কেবলমাত্র একটি উপাদান ফেরত দিতে LIMIT 1 ব্যবহার করুন।
@Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC LIMIT 1")
fun getTonight(): SleepNight?
  1. একটি getAllNights() ফাংশন সহ একটি @Query যুক্ত করুন:
  • এসকিউএলাইট ক্যোয়ারীটি daily_sleep_quality_table থেকে সমস্ত কলাম ফিরিয়ে দিন, অবতরণ ক্রমে অর্ডার করা হয়েছে।
  • getAllNights() LiveData হিসাবে SleepNight সত্তার একটি তালিকা ফিরিয়ে দিন। Room আপনার জন্য এই LiveData আপডেট করে রাখে, যার অর্থ আপনাকে কেবল একবারে স্পষ্টভাবে ডেটা পেতে হবে।
  • আপনার androidx.lifecycle.LiveData থেকে LiveData আমদানি করতে হবে।
@Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC")
fun getAllNights(): LiveData<List<SleepNight>>
  1. যদিও আপনি কোনও দৃশ্যমান পরিবর্তন দেখতে পাবেন না, আপনার অ্যাপটি কোনও ত্রুটি নেই তা নিশ্চিত করার জন্য আপনার অ্যাপটি চালান।

এই কার্যক্রমে, আপনি একটি Room ডাটাবেস তৈরি করেন যা আপনি পূর্ববর্তী টাস্কে তৈরি Entity এবং ডিএও ব্যবহার করেন।

আপনাকে @Database দিয়ে টীকাযুক্ত একটি বিমূর্ত ডাটাবেস ধারক শ্রেণি তৈরি করতে হবে। এই শ্রেণীর একটি পদ্ধতি রয়েছে যা ডাটাবেসের উপস্থিতি না থাকলে ডাটাবেসের একটি উদাহরণ তৈরি করে, বা বিদ্যমান ডাটাবেসের একটি রেফারেন্স দেয়।

একটি Room ডাটাবেস পাওয়া কিছুটা জড়িত, সুতরাং কোডটি শুরু করার আগে এখানে সাধারণ প্রক্রিয়াটি এখানে:

  • একটি public abstract ক্লাস তৈরি করুন যা extends RoomDatabase । এই শ্রেণিটি একটি ডাটাবেস ধারক হিসাবে কাজ করবে। ক্লাসটি বিমূর্ত, কারণ Room আপনার জন্য বাস্তবায়ন তৈরি করে।
  • @Database দিয়ে ক্লাসটি টীকা দিন। যুক্তিগুলিতে, ডাটাবেসের জন্য সত্তাগুলি ঘোষণা করুন এবং সংস্করণ নম্বরটি সেট করুন।
  • কোনও companion বস্তুর অভ্যন্তরে, একটি বিমূর্ত পদ্ধতি বা সম্পত্তি সংজ্ঞায়িত করুন যা একটি SleepDatabaseDao ফিরিয়ে দেয়। Room আপনার জন্য শরীর তৈরি করবে।
  • পুরো অ্যাপ্লিকেশনটির জন্য আপনার কেবল Room ডাটাবেসের একটি উদাহরণ প্রয়োজন, তাই RoomDatabase একটি সিঙ্গলটন করুন।
  • ডাটাবেস তৈরি করতে কেবল ডাটাবেস তৈরি করতে Room ডাটাবেস বিল্ডার ব্যবহার করুন। অন্যথায়, বিদ্যমান ডাটাবেসটি ফিরিয়ে দিন।

পদক্ষেপ 1: ডাটাবেস তৈরি করুন

  1. database প্যাকেজে, SleepDatabase.kt খুলুন।
  2. ফাইলটিতে, SleepDatabase নামে একটি abstract শ্রেণি তৈরি করুন যা RoomDatabase প্রসারিত করে।

    @Database দিয়ে ক্লাসটি টীকা দিন।
@Database()
abstract class SleepDatabase : RoomDatabase() {}
  1. আপনি সত্তা এবং সংস্করণ পরামিতিগুলির জন্য একটি ত্রুটি দেখতে পাবেন। @Database টীকাটির জন্য বেশ কয়েকটি যুক্তি প্রয়োজন, যাতে Room ডাটাবেস তৈরি করতে পারে।
  • entities তালিকা সহ একমাত্র আইটেম হিসাবে SleepNight সরবরাহ করুন।
  • version 1 হিসাবে সেট করুন আপনি যখনই স্কিমা পরিবর্তন করবেন, আপনাকে সংস্করণ নম্বরটি বাড়িয়ে তুলতে হবে।
  • স্কিমা সংস্করণ ইতিহাসের ব্যাকআপ না রাখার জন্য exportSchema false বলে সেট করুন।
entities = [SleepNight::class], version = 1, exportSchema = false
  1. ডাটাবেসটি ডিএও সম্পর্কে জানতে হবে। ক্লাসের দেহের অভ্যন্তরে, একটি বিমূর্ত মান ঘোষণা করুন যা SleepDatabaseDao ফিরিয়ে দেয়। আপনার একাধিক ডিএও থাকতে পারে।
abstract val sleepDatabaseDao: SleepDatabaseDao
  1. এর নীচে, একটি companion বস্তু সংজ্ঞায়িত করুন। সঙ্গী অবজেক্টটি ক্লায়েন্টদের ক্লাসটি তাত্ক্ষণিক না করে ডাটাবেস তৈরি বা পাওয়ার পদ্ধতিগুলি অ্যাক্সেস করতে দেয়। যেহেতু এই শ্রেণীর একমাত্র উদ্দেশ্য হ'ল একটি ডাটাবেস সরবরাহ করা, এটি কখনও ইনস্ট্যান্ট করার কোনও কারণ নেই।
 companion object {}
  1. companion অবজেক্টের অভ্যন্তরে, ডাটাবেসের জন্য একটি ব্যক্তিগত বাতিলযোগ্য পরিবর্তনশীল INSTANCE ঘোষণা করুন এবং এটিকে null থেকে শুরু করুন। INSTANCE ভেরিয়েবলটি একবার তৈরি হয়ে গেলে ডাটাবেসের একটি রেফারেন্স রাখবে। এটি আপনাকে ডাটাবেসের সাথে বারবার সংযোগগুলি এড়াতে সহায়তা করে যা ব্যয়বহুল।

@Volatile সাথে INSTANCE টীকা দিন। একটি অস্থির ভেরিয়েবলের মান কখনই ক্যাশে করা হবে না এবং সমস্ত লেখার এবং পাঠগুলি মূল স্মৃতিতে এবং থেকে করা হবে। এটি INSTANCE সর্বদা আপ-টু-ডেট এবং সমস্ত এক্সিকিউশন থ্রেডের সাথে একই রকম হয় তা নিশ্চিত করতে সহায়তা করে। এর অর্থ হ'ল INSTANCE একটি থ্রেড দ্বারা তৈরি করা পরিবর্তনগুলি অবিলম্বে অন্যান্য সমস্ত থ্রেডে দৃশ্যমান হয় এবং আপনি এমন কোনও পরিস্থিতি পান না যেখানে বলুন, দুটি থ্রেড প্রতিটি ক্যাশে একই সত্তাকে আপডেট করে, যা একটি সমস্যা তৈরি করে।

@Volatile
private var INSTANCE: SleepDatabase? = null
  1. INSTANCE , এখনও companion অবজেক্টের অভ্যন্তরে, ডাটাবেস নির্মাতার প্রয়োজন হবে এমন একটি Context প্যারামিটার সহ একটি getInstance() পদ্ধতিটি সংজ্ঞায়িত করুন। একটি টাইপ SleepDatabase ফেরত দিন। আপনি একটি ত্রুটি দেখতে পাবেন কারণ getInstance() এখনও কিছু ফিরছে না।
fun getInstance(context: Context): SleepDatabase {}
  1. getInstance() এর ভিতরে, একটি synchronized{} ব্লক যুক্ত করুন। this পাস করুন যাতে আপনি প্রসঙ্গটি অ্যাক্সেস করতে পারেন।

    একাধিক থ্রেড একই সময়ে একটি ডাটাবেস উদাহরণ চাইতে পারে, যার ফলে একটির পরিবর্তে দুটি ডাটাবেস হয়। এই সমস্যাটি এই নমুনা অ্যাপ্লিকেশনটিতে হওয়ার সম্ভাবনা নেই, তবে এটি আরও জটিল অ্যাপ্লিকেশনটির জন্য সম্ভব। ডাটাবেসটি synchronized পেতে কোডটি মোড়ানোর অর্থ হ'ল একবারে এক্সিকিউশনের কেবলমাত্র একটি থ্রেড কোডের এই ব্লকটি প্রবেশ করতে পারে, যা নিশ্চিত করে যে ডাটাবেসটি কেবল একবারে আরম্ভ হয়।
synchronized(this) {}
  1. সিঙ্ক্রোনাইজড ব্লকের অভ্যন্তরে, INSTANCE বর্তমান মানটি স্থানীয় পরিবর্তনশীল instance অনুলিপি করুন। এটি স্মার্ট কাস্টের সুবিধা গ্রহণ করা, যা কেবল স্থানীয় ভেরিয়েবলের জন্য উপলব্ধ।
var instance = INSTANCE
  1. synchronized ব্লকের অভ্যন্তরে, synchronized ব্লকের শেষে return instance । রিটার্ন টাইপ অমিল ত্রুটি উপেক্ষা করুন; আপনার কাজ শেষ হয়ে গেলে আপনি কখনই নাল ফিরবেন না।
return instance
  1. return স্টেটমেন্টের উপরে, instance নাল কিনা তা যাচাই করার জন্য একটি if বিবৃতি যুক্ত করুন, এটি এখনও কোনও ডাটাবেস নেই।
if (instance == null) {}
  1. যদি instance null হয় তবে একটি ডাটাবেস পেতে ডাটাবেস বিল্ডার ব্যবহার করুন। if স্টেটমেন্টের বডিটিতে, Room.databaseBuilder অনুরোধ করুন এবং আপনি যে প্রসঙ্গটি পাস করেছেন তা সরবরাহ করুন, ডাটাবেস শ্রেণি এবং ডাটাবেসের জন্য একটি নাম, sleep_history_database । ত্রুটিটি অপসারণ করতে, আপনাকে একটি মাইগ্রেশন কৌশল যুক্ত করতে হবে এবং নিম্নলিখিত পদক্ষেপগুলিতে build()
instance = Room.databaseBuilder(
                           context.applicationContext,
                           SleepDatabase::class.java,
                           "sleep_history_database")
  1. বিল্ডারকে প্রয়োজনীয় মাইগ্রেশন কৌশল যুক্ত করুন। ব্যবহার করুন .fallbackToDestructiveMigration()

    সাধারণত, স্কিমা পরিবর্তিত হওয়ার জন্য আপনাকে মাইগ্রেশন কৌশল সহ একটি মাইগ্রেশন অবজেক্ট সরবরাহ করতে হবে। মাইগ্রেশন অবজেক্ট হ'ল এমন একটি বস্তু যা আপনি কীভাবে পুরানো স্কিমার সাথে সমস্ত সারি গ্রহণ করেন এবং নতুন স্কিমাতে সারিগুলিতে রূপান্তর করেন তা নির্ধারণ করে, যাতে কোনও ডেটা হারিয়ে না যায়। মাইগ্রেশন এই কোডল্যাবের সুযোগের বাইরে। একটি সহজ সমাধান হ'ল ডাটাবেসটি ধ্বংস এবং পুনর্নির্মাণ করা, যার অর্থ ডেটা হারিয়ে গেছে।
.fallbackToDestructiveMigration()
  1. অবশেষে, কল করুন .build()
.build()
  1. if স্টেটমেন্টের ভিতরে চূড়ান্ত পদক্ষেপ হিসাবে INSTANCE = instance নির্ধারণ করুন।
INSTANCE = instance
  1. আপনার চূড়ান্ত কোডটি দেখতে এটির মতো হওয়া উচিত:
@Database(entities = [SleepNight::class], version = 1, exportSchema = false)
abstract class SleepDatabase : RoomDatabase() {

   abstract val sleepDatabaseDao: SleepDatabaseDao

   companion object {

       @Volatile
       private var INSTANCE: SleepDatabase? = null

       fun getInstance(context: Context): SleepDatabase {
           synchronized(this) {
               var instance = INSTANCE

               if (instance == null) {
                   instance = Room.databaseBuilder(
                           context.applicationContext,
                           SleepDatabase::class.java,
                           "sleep_history_database"
                   )
                           .fallbackToDestructiveMigration()
                           .build()
                   INSTANCE = instance
               }
               return instance
           }
       }
   }
}
  1. আপনার কোড তৈরি এবং চালান।

আপনার Room ডাটাবেসের সাথে কাজ করার জন্য এখন আপনার কাছে সমস্ত বিল্ডিং ব্লক রয়েছে। এই কোডটি সংকলন করে এবং চালায়, তবে এটি আসলে কাজ করে কিনা তা বলার কোনও উপায় আপনার নেই। সুতরাং, কিছু প্রাথমিক পরীক্ষা যুক্ত করার জন্য এটি একটি ভাল সময়।

পদক্ষেপ 2: স্লিপডাটাবেস পরীক্ষা করুন

এই পদক্ষেপে, আপনি আপনার ডাটাবেসটি কাজ করে তা যাচাই করার জন্য প্রদত্ত পরীক্ষাগুলি চালান। এটি নিশ্চিত করতে সহায়তা করে যে আপনি এটি তৈরির আগে ডাটাবেসটি কাজ করে। প্রদত্ত পরীক্ষাগুলি মৌলিক। একটি প্রোডাকশন অ্যাপের জন্য, আপনি সমস্ত ডিএওতে সমস্ত ফাংশন এবং প্রশ্নগুলি অনুশীলন করবেন।

স্টার্টার অ্যাপ্লিকেশনটিতে একটি অ্যান্ড্রয়েডটেস্ট ফোল্ডার রয়েছে। এই অ্যান্ড্রয়েডস্টেস্ট ফোল্ডারে ইউনিট পরীক্ষা রয়েছে যা অ্যান্ড্রয়েড ইনস্ট্রুমেন্টেশন জড়িত, যা পরীক্ষাগুলির অ্যান্ড্রয়েড ফ্রেমওয়ার্কের প্রয়োজন তা বলার একটি অভিনব উপায়, সুতরাং আপনাকে শারীরিক বা ভার্চুয়াল ডিভাইসে পরীক্ষা চালানো দরকার। অবশ্যই, আপনি খাঁটি ইউনিট পরীক্ষা তৈরি এবং চালাতে পারেন যা অ্যান্ড্রয়েড ফ্রেমওয়ার্ক জড়িত না।

  1. অ্যান্ড্রয়েড স্টুডিওতে, অ্যান্ড্রয়েডটেস্ট ফোল্ডারে, স্লিপড্যাটাব্যাসেটেস্ট ফাইলটি খুলুন।
  2. কোডটি আপত্তি করতে, সমস্ত মন্তব্য করা কোড নির্বাচন করুন এবং Cmd+/ অথবা Control+/ কীবোর্ড শর্টকাট টিপুন।
  3. ফাইলটি একবার দেখুন।

এখানে পরীক্ষার কোডের একটি দ্রুত রান-থ্রো রয়েছে, কারণ এটি কোডের আরও একটি অংশ যা আপনি পুনরায় ব্যবহার করতে পারেন:

  • SleepDabaseTest একটি পরীক্ষার ক্লাস
  • @RunWith টীকাটি টেস্ট রানারকে সনাক্ত করে, যা প্রোগ্রামটি সেট আপ করে এবং পরীক্ষাগুলি সম্পাদন করে।
  • সেটআপ চলাকালীন, @Before সাথে টীকাযুক্ত ফাংশনটি কার্যকর করা হয় এবং এটি SleepDatabaseDao সাথে একটি মেমরি SleepDatabase তৈরি করে। "ইন-মেমরি" এর অর্থ হ'ল এই ডাটাবেসটি ফাইল সিস্টেমে সংরক্ষণ করা হয় না এবং পরীক্ষাগুলি চালানোর পরে মুছে ফেলা হবে।
  • এছাড়াও ইন-মেমরি ডাটাবেস তৈরি করার সময়, কোডটি অন্য একটি পরীক্ষা-নির্দিষ্ট পদ্ধতি, allowMainThreadQueries কল করে। ডিফল্টরূপে, আপনি যদি মূল থ্রেডে প্রশ্ন চালানোর চেষ্টা করেন তবে আপনি একটি ত্রুটি পাবেন। এই পদ্ধতিটি আপনাকে মূল থ্রেডে পরীক্ষা চালানোর অনুমতি দেয়, যা আপনাকে কেবল পরীক্ষার সময় করা উচিত।
  • @Test সাথে বর্ণিত একটি পরীক্ষার পদ্ধতিতে, আপনি একটি SleepNight তৈরি, সন্নিবেশ এবং পুনরুদ্ধার করুন এবং দৃ sert ়ভাবে জানান যে তারা একই। যদি কিছু ভুল হয়ে যায় তবে একটি ব্যতিক্রম নিক্ষেপ করুন। একটি বাস্তব পরীক্ষায়, আপনার একাধিক @Test থাকবে পদ্ধতি
  • পরীক্ষা করা হয়ে গেলে, @After সাথে টীকাযুক্ত ফাংশনটি ডাটাবেসটি বন্ধ করতে কার্যকর করে।
  1. প্রজেক্ট ফলকে টেস্ট ফাইলে ডান ক্লিক করুন এবং 'স্লিপড্যাটাব্যাসেটেস্ট' চালান নির্বাচন করুন।
  2. পরীক্ষাগুলি চালানোর পরে, সমস্ত পরীক্ষাগুলি পাস করা স্লিপড্যাটাব্যাসেস্ট ফলকে যাচাই করুন।

যেহেতু সমস্ত পরীক্ষা পাস হয়েছে, আপনি এখন বেশ কয়েকটি জিনিস জানেন:

  • ডাটাবেসটি সঠিকভাবে তৈরি হয়।
  • আপনি ডাটাবেসে একটি SleepNight .োকাতে পারেন।
  • আপনি SleepNight ফিরে পেতে পারেন।
  • SleepNight মানের জন্য সঠিক মান রয়েছে।

অ্যান্ড্রয়েড স্টুডিও প্রকল্প: ট্র্যাকমিস্লিপকুয়ালিটির রুম্যান্ডস্টেস্টিং

কোনও ডাটাবেস পরীক্ষা করার সময়, আপনাকে ডিএওতে সংজ্ঞায়িত সমস্ত পদ্ধতি অনুশীলন করতে হবে। পরীক্ষা সম্পূর্ণ করতে , অন্যান্য ডিএও পদ্ধতিগুলি অনুশীলনের জন্য পরীক্ষা যুক্ত করুন এবং সম্পাদন করুন।

  • আপনার টেবিলগুলি @Entity সাথে টীকাযুক্ত ডেটা ক্লাস হিসাবে সংজ্ঞায়িত করুন। টেবিলগুলিতে কলাম হিসাবে @ColumnInfo দিয়ে টীকাযুক্ত বৈশিষ্ট্যগুলি সংজ্ঞায়িত করুন।
  • একটি ডেটা অ্যাক্সেস অবজেক্ট (ডিএও) সংজ্ঞায়িত করুন @Dao সাথে বর্ণিত একটি ইন্টারফেস হিসাবে। ডিএও ম্যাপস কোটলিন ডাটাবেস কোয়েরিতে কাজ করে।
  • @Insert , @Delete এবং @Update ফাংশনগুলি সংজ্ঞায়িত করতে টীকাগুলি ব্যবহার করুন।
  • অন্য কোনও প্রশ্নের জন্য প্যারামিটার হিসাবে একটি এসকিউলাইট ক্যোয়ারী স্ট্রিং সহ @Query টীকাটি ব্যবহার করুন।
  • একটি বিমূর্ত শ্রেণি তৈরি করুন যা একটি getInstance() ফাংশন রয়েছে যা একটি ডাটাবেস দেয়।
  • আপনার ডাটাবেস এবং ডিএও প্রত্যাশার মতো কাজ করছে তা পরীক্ষা করার জন্য সরঞ্জামযুক্ত পরীক্ষাগুলি ব্যবহার করুন। আপনি প্রদত্ত পরীক্ষাগুলি টেম্পলেট হিসাবে ব্যবহার করতে পারেন।

উদাসী কোর্স:

অ্যান্ড্রয়েড বিকাশকারী ডকুমেন্টেশন:

অন্যান্য ডকুমেন্টেশন এবং নিবন্ধ:

এই বিভাগটি একজন প্রশিক্ষকের নেতৃত্বে একটি কোর্সের অংশ হিসাবে এই কোডল্যাবের মাধ্যমে কাজ করা শিক্ষার্থীদের জন্য সম্ভাব্য হোমওয়ার্ক অ্যাসাইনমেন্টগুলি তালিকাভুক্ত করে। নিম্নলিখিতগুলি করা প্রশিক্ষকের উপর নির্ভর করে:

  • প্রয়োজনে হোমওয়ার্ক বরাদ্দ করুন।
  • কীভাবে হোমওয়ার্ক অ্যাসাইনমেন্ট জমা দিতে হয় তা শিক্ষার্থীদের সাথে যোগাযোগ করুন।
  • হোমওয়ার্ক অ্যাসাইনমেন্টগুলি গ্রেড করুন।

প্রশিক্ষকরা এই পরামর্শগুলি যতটা চান বা যতটা চান ততটুকু ব্যবহার করতে পারেন এবং তারা উপযুক্ত বলে মনে করেন এমন অন্য যে কোনও হোমওয়ার্ক নির্ধারণ করতে নির্দ্বিধায় বোধ করা উচিত।

আপনি যদি নিজে থেকে এই কোডল্যাবের মাধ্যমে কাজ করছেন তবে আপনার জ্ঞান পরীক্ষা করতে এই হোমওয়ার্ক অ্যাসাইনমেন্টগুলি নির্দ্বিধায় ব্যবহার করুন।

এই প্রশ্নগুলোর উত্তর দাও

প্রশ্ন 1

আপনি কীভাবে নির্দেশ করেন যে কোনও শ্রেণি কোনও Room ডাটাবেসে সঞ্চয় করার জন্য কোনও সত্তাকে উপস্থাপন করে?

  • ক্লাসটি প্রসারিত DatabaseEntity তৈরি করুন।
  • @Entity সহ ক্লাসটি টীকা দিন।
  • @Database দিয়ে ক্লাসটি টীকা দিন।
  • ক্লাসটি প্রসারিত RoomEntity তৈরি করুন এবং @Room সাথে ক্লাসটি টীকা দিন।

প্রশ্ন 2

ডিএও (ডেটা অ্যাক্সেস অবজেক্ট) এমন একটি ইন্টারফেস যা Room ডাটাবেস ক্যোয়ারীগুলিতে কোটলিন ফাংশনগুলি মানচিত্র করতে ব্যবহার করে।

আপনি কীভাবে নির্দেশ করেন যে কোনও ইন্টারফেস একটি Room ডাটাবেসের জন্য একটি ডিএওর প্রতিনিধিত্ব করে?

  • ইন্টারফেসটি RoomDAO প্রসারিত করুন।
  • ইন্টারফেসটি প্রসারিত EntityDao করুন, তারপরে DaoConnection() পদ্ধতিটি প্রয়োগ করুন।
  • @Dao সাথে ইন্টারফেসটি টীকা দিন।
  • ইন্টারফেসটি @RoomConnection সংযোগের সাথে টীকা দিন।

প্রশ্ন 3

নীচের কোন বিবৃতি Room ডাটাবেস সম্পর্কে সত্য? প্রযোজ্য সব চয়ন করুন.

  • আপনি টীকাযুক্ত ডেটা ক্লাস হিসাবে একটি Room ডাটাবেসের জন্য টেবিলগুলি সংজ্ঞায়িত করতে পারেন।
  • আপনি যদি কোনও ক্যোয়ারী থেকে LiveData ফিরিয়ে দেন তবে LiveData পরিবর্তিত হলে Room আপনার জন্য LiveData আপডেট রাখবে।
  • প্রতিটি Room ডাটাবেসে অবশ্যই একটি এবং কেবল একটি, ডিএও থাকতে হবে।
  • Room ডাটাবেস হিসাবে কোনও শ্রেণিকে সনাক্ত করতে, এটিকে RoomDatabase একটি সাবক্লাস তৈরি করুন এবং এটি @Database দিয়ে টীকা দিন।

প্রশ্ন 4

আপনি আপনার @Dao ইন্টারফেসে নিম্নলিখিত কোন টীকাগুলি ব্যবহার করতে পারেন? প্রযোজ্য সব চয়ন করুন.

  • @Get
  • @Update
  • @Insert
  • @Query

প্রশ্ন 5

আপনি কীভাবে যাচাই করতে পারেন যে আপনার ডাটাবেসটি কাজ করছে? প্রযোজ্য সব নির্বাচন করুন.

  • সরঞ্জামযুক্ত পরীক্ষা লিখুন।
  • অ্যাপ্লিকেশনটি ডেটা প্রদর্শন না করা পর্যন্ত অ্যাপ্লিকেশনটি লেখা এবং চালানো চালিয়ে যান।
  • Entity শ্রেণীর সমতুল্য পদ্ধতিতে কল দ্বারা ডিএও ইন্টারফেসের পদ্ধতিগুলিতে কলগুলি প্রতিস্থাপন করুন।
  • Room লাইব্রেরি দ্বারা সরবরাহিত verifyDatabase() ফাংশনটি চালান।

পরবর্তী পাঠ শুরু করুন: 6.2 করুটাইনস এবং রুম

এই কোর্সে অন্যান্য কোডেল্যাবগুলির লিঙ্কগুলির জন্য, অ্যান্ড্রয়েড কোটলিন ফান্ডামেন্টালস কোডল্যাবস ল্যান্ডিং পৃষ্ঠাটি দেখুন।