দুটি এনটিটির মধ্যে এক-এক সম্পর্ক হলো এমন একটি সম্পর্ক যেখানে প্যারেন্ট এনটিটির প্রতিটি ইনস্ট্যান্স চাইল্ড এনটিটির ঠিক একটি ইনস্ট্যান্সের সাথে সঙ্গতিপূর্ণ থাকে এবং এর বিপরীতটিও সত্য।
উদাহরণস্বরূপ, একটি মিউজিক স্ট্রিমিং অ্যাপের কথা ভাবুন যেখানে ব্যবহারকারীর নিজস্ব গানের একটি লাইব্রেরি থাকে। প্রত্যেক ব্যবহারকারীর কেবল একটিই লাইব্রেরি থাকে এবং প্রতিটি লাইব্রেরি ঠিক একজন ব্যবহারকারীর প্রতিনিধিত্ব করে। সুতরাং, User এনটিটি এবং Library এনটিটির মধ্যে একটি এক-এক সম্পর্ক বিদ্যমান।
আপনার ডাটাবেসে ওয়ান-টু-ওয়ান সম্পর্ক সংজ্ঞায়িত করতে এবং কোয়েরি করতে এই ধাপগুলো অনুসরণ করুন:
- সম্পর্কটি সংজ্ঞায়িত করুন : উভয় এনটিটির জন্য ক্লাস তৈরি করুন এবং নিশ্চিত করুন যে একটি অন্যটির প্রাইমারি কী-কে রেফারেন্স করে।
- এনটিটিগুলো কোয়েরি করুন : একটি নতুন ডেটা ক্লাসে সম্পর্কটি মডেল করুন এবং সম্পর্কিত ডেটা পুনরুদ্ধার করার জন্য একটি ফাংশন তৈরি করুন।
সম্পর্কটি সংজ্ঞায়িত করুন
এক-এক সম্পর্ক নির্ধারণ করতে, প্রথমে আপনার দুটি এনটিটির প্রতিটির জন্য একটি করে ক্লাস তৈরি করুন। এনটিটিগুলোর মধ্যে একটিতে অবশ্যই একটি ভেরিয়েবল অন্তর্ভুক্ত থাকতে হবে, যা অন্য এনটিটির প্রাইমারি কী-কে রেফারেন্স করবে।
@Entity data class User( @PrimaryKey val userId: Long, val name: String, val age: Int ) @Entity data class Library( @PrimaryKey val libraryId: Long, val userOwnerId: Long )
সত্তাগুলো সম্পর্কে জিজ্ঞাসা করুন
ব্যবহারকারী এবং সংশ্লিষ্ট লাইব্রেরির তালিকা কোয়েরি করতে হলে, আপনাকে প্রথমে এই দুটি সত্তার মধ্যেকার এক-এক সম্পর্কটি মডেল করতে হবে।
সম্পর্কটি মডেল করার জন্য, একটি নতুন ডেটা ক্লাস তৈরি করুন যেখানে প্রতিটি ইনস্ট্যান্সে প্যারেন্ট এনটিটি এবং সংশ্লিষ্ট চাইল্ড এনটিটির একটি করে ইনস্ট্যান্স থাকবে। চাইল্ড এনটিটিতে @Relation অ্যানোটেশনটি যোগ করুন। parentColumns প্যারেন্ট এনটিটির প্রাইমারি কী কলামের নামে এবং entityColumns চাইল্ড এনটিটির সেই কলামের নামে সেট করুন যা প্যারেন্টের প্রাইমারি কী-কে রেফারেন্স করে।
data class UserAndLibrary( @Embedded val user: User, @Relation( parentColumns = ["userId"], entityColumns = ["userOwnerId"] ) val library: Library )
অবশেষে, ডেটা অ্যাক্সেস অবজেক্ট (DAO) ক্লাসে এমন একটি ফাংশন যোগ করুন যা প্যারেন্ট এনটিটির সাথে চাইল্ড এনটিটিকে যুক্তকারী ডেটা ক্লাসের সমস্ত ইনস্ট্যান্স রিটার্ন করে। @Transaction অ্যানোটেশনটি যোগ করুন যাতে Room সম্পূর্ণ অপারেশনটি অ্যাটমিকভাবে সম্পাদন করে, কারণ এই ফাংশনটির জন্য Room-কে দুটি কোয়েরি চালাতে হয়।
@Transaction @Query("SELECT * FROM User") suspend fun getUsersAndLibraries(): List<UserAndLibrary>
যৌগিক চাবি
যদি আপনি কম্পোজিট কী ব্যবহার করে সম্পর্কটি নির্ধারণ করেন, তাহলে parentColumns এবং entityColumns এ একাধিক কলাম উল্লেখ করুন। parentColumns এর কলামগুলোর ক্রম অবশ্যই entityColumns এর কলামগুলোর ক্রমের সাথে মিলতে হবে।
@Entity(primaryKeys = ["firstName", "lastName"]) data class User( val firstName: String, val lastName: String, val age: Int ) @Entity data class Library( @PrimaryKey val libraryId: Long, val userFirstName: String, val userLastName: String ) data class UserAndLibrary( @Embedded val user: User, @Relation( parentColumns = ["firstName", "lastName"], entityColumns = ["userFirstName", "userLastName"] ) val library: Library )