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