যেহেতু SQLite একটি রিলেশনাল ডাটাবেস, আপনি সত্তার মধ্যে সম্পর্ক নির্ধারণ করতে পারেন। কিন্তু বেশিরভাগ অবজেক্ট-রিলেশনাল ম্যাপিং লাইব্রেরি সত্তা বস্তুকে একে অপরকে রেফারেন্স করতে দেয়, রুম স্পষ্টভাবে এটি নিষিদ্ধ করে। এই সিদ্ধান্তের পিছনে প্রযুক্তিগত যুক্তি সম্পর্কে জানতে, রুম কেন অবজেক্ট রেফারেন্সের অনুমতি দেয় না তা বুঝতে দেখুন।
সম্পর্কের প্রকারভেদ
রুম নিম্নলিখিত ধরনের সম্পর্ক সমর্থন করে:
- এক থেকে এক : এমন একটি সম্পর্কের প্রতিনিধিত্ব করে যেখানে একটি একক সত্তা অন্য একক সত্তার সাথে সম্পর্কিত।
- এক-থেকে-অনেক : এমন একটি সম্পর্কের প্রতিনিধিত্ব করে যেখানে একটি একক সত্তা অন্য ধরণের একাধিক সত্তার সাথে সম্পর্কিত হতে পারে।
- বহু-থেকে-অনেক : এমন একটি সম্পর্কের প্রতিনিধিত্ব করে যেখানে এক ধরনের একাধিক সত্তা অন্য ধরনের একাধিক সত্তার সাথে সম্পর্কিত হতে পারে। এটি সাধারণত একটি জংশন টেবিল প্রয়োজন.
- নেস্টেড রিলেশনশিপস (এম্বেডেড অবজেক্ট ব্যবহার করে) : এমন একটি সম্পর্ককে প্রতিনিধিত্ব করে যেখানে একটি সত্তা একটি ক্ষেত্র হিসাবে অন্য সত্তাকে ধারণ করে এবং এই নেস্টেড সত্তাটি আরও অন্যান্য সত্তাকে ধারণ করতে পারে। এটি
@Embedded
টীকা ব্যবহার করে।
দুটি পদ্ধতির মধ্যে নির্বাচন করুন
রুমে, সত্তার মধ্যে সম্পর্ক নির্ধারণ এবং অনুসন্ধান করার দুটি উপায় রয়েছে। আপনি উভয় ব্যবহার করতে পারেন:
- এমবেডেড অবজেক্ট সহ একটি মধ্যবর্তী ডেটা ক্লাস বা
- একটি মাল্টিম্যাপ রিটার্ন টাইপ সহ একটি রিলেশনাল কোয়েরি পদ্ধতি।
আপনার যদি মধ্যবর্তী ডেটা ক্লাসগুলি ব্যবহার করার নির্দিষ্ট কারণ না থাকে তবে আমরা মাল্টিম্যাপ রিটার্ন টাইপ পদ্ধতি ব্যবহার করার পরামর্শ দিই। এই পদ্ধতি সম্পর্কে আরও জানতে, একটি মাল্টিম্যাপ ফেরত দেখুন।
ইন্টারমিডিয়েট ডেটা ক্লাস পদ্ধতি আপনাকে জটিল এসকিউএল কোয়েরি লিখতে এড়াতে দেয়, তবে এর ফলে কোডের জটিলতাও বৃদ্ধি পেতে পারে কারণ এর জন্য অতিরিক্ত ডেটা ক্লাসের প্রয়োজন হয়। সংক্ষেপে, মাল্টিম্যাপ রিটার্ন টাইপ পদ্ধতির জন্য আপনার এসকিউএল কোয়েরিগুলিকে আরও কাজ করতে হবে এবং মধ্যবর্তী ডেটা ক্লাস পদ্ধতির জন্য আরও কাজ করার জন্য আপনার কোডের প্রয়োজন।
মধ্যবর্তী ডেটা ক্লাস পদ্ধতি ব্যবহার করুন
মধ্যবর্তী ডেটা ক্লাস পদ্ধতিতে, আপনি একটি ডেটা ক্লাস সংজ্ঞায়িত করেন যা আপনার রুম সত্তার মধ্যে সম্পর্ককে মডেল করে। এই ডেটা ক্লাসটি এমবেডেড অবজেক্ট হিসাবে একটি সত্তার দৃষ্টান্ত এবং অন্য সত্তার দৃষ্টান্তগুলির মধ্যে জোড় ধারণ করে৷ আপনার ক্যোয়ারী পদ্ধতিগুলি আপনার অ্যাপে ব্যবহারের জন্য এই ডেটা ক্লাসের উদাহরণগুলি ফেরত দিতে পারে।
উদাহরণস্বরূপ, আপনি নির্দিষ্ট বই চেক আউট করে লাইব্রেরি ব্যবহারকারীদের প্রতিনিধিত্ব করার জন্য একটি UserBook
ডেটা ক্লাস সংজ্ঞায়িত করতে পারেন এবং ডাটাবেস থেকে UserBook
উদাহরণগুলির একটি তালিকা পুনরুদ্ধার করার জন্য একটি ক্যোয়ারী পদ্ধতি সংজ্ঞায়িত করতে পারেন:
কোটলিন
@Dao
interface UserBookDao {
@Query(
"SELECT user.name AS userName, book.name AS bookName " +
"FROM user, book " +
"WHERE user.id = book.user_id"
)
fun loadUserAndBookNames(): LiveData<List<UserBook>>
}
data class UserBook(val userName: String?, val bookName: String?)
জাভা
@Dao
public interface UserBookDao {
@Query("SELECT user.name AS userName, book.name AS bookName " +
"FROM user, book " +
"WHERE user.id = book.user_id")
public LiveData<List<UserBook>> loadUserAndBookNames();
}
public class UserBook {
public String userName;
public String bookName;
}
মাল্টিম্যাপ রিটার্ন প্রকার পদ্ধতি ব্যবহার করুন
মাল্টিম্যাপ রিটার্ন টাইপ পদ্ধতিতে, আপনাকে কোনও অতিরিক্ত ডেটা ক্লাস সংজ্ঞায়িত করতে হবে না। পরিবর্তে, আপনি মানচিত্র কাঠামোর উপর ভিত্তি করে আপনার পদ্ধতির জন্য একটি মাল্টিম্যাপ রিটার্ন টাইপ সংজ্ঞায়িত করুন এবং আপনার এসকিউএল ক্যোয়ারীতে সরাসরি আপনার সত্তার মধ্যে সম্পর্ক সংজ্ঞায়িত করুন।
উদাহরণস্বরূপ, নিম্নলিখিত ক্যোয়ারী পদ্ধতিটি নির্দিষ্ট বই চেক আউট সহ লাইব্রেরি ব্যবহারকারীদের প্রতিনিধিত্ব করতে User
এবং Book
উদাহরণগুলির একটি ম্যাপিং প্রদান করে:
কোটলিন
@Query(
"SELECT * FROM user" +
"JOIN book ON user.id = book.user_id"
)
fun loadUserAndBookNames(): Map<User, List<Book>>
জাভা
@Query(
"SELECT * FROM user" +
"JOIN book ON user.id = book.user_id"
)
public Map<User, List<Book>> loadUserAndBookNames();
এমবেডেড অবজেক্ট তৈরি করুন
কখনও কখনও, আপনি একটি সত্তা বা ডেটা অবজেক্টকে আপনার ডাটাবেস লজিকে একটি সমন্বিত সমগ্র হিসাবে প্রকাশ করতে চান, এমনকি যদি বস্তুটিতে বেশ কয়েকটি ক্ষেত্র থাকে। এই পরিস্থিতিতে, আপনি একটি বস্তুর প্রতিনিধিত্ব করতে @Embedded
টীকা ব্যবহার করতে পারেন যা আপনি একটি টেবিলের মধ্যে এর সাবফিল্ডে পচতে চান। তারপরে আপনি এমবেডেড ক্ষেত্রগুলিকে জিজ্ঞাসা করতে পারেন ঠিক যেমন আপনি অন্যান্য পৃথক কলামগুলির জন্য করেন৷
উদাহরণ স্বরূপ, আপনার User
ক্লাস Address
টাইপের একটি ক্ষেত্র অন্তর্ভুক্ত করতে পারে যা street
, city
, state
, এবং postCode
নামক ক্ষেত্রগুলির একটি রচনাকে প্রতিনিধিত্ব করে৷ টেবিলে আলাদাভাবে কম্পোজ করা কলাম সংরক্ষণ করতে, একটি Address
ক্ষেত্র অন্তর্ভুক্ত করুন। এটি @Embedded
এর সাথে টীকাযুক্ত User
ক্লাসে উপস্থিত হওয়া উচিত। নিম্নলিখিত কোড স্নিপেট এটি প্রদর্শন করে:
কোটলিন
data class Address(
val street: String?,
val state: String?,
val city: String?,
@ColumnInfo(name = "post_code") val postCode: Int
)
@Entity
data class User(
@PrimaryKey val id: Int,
val firstName: String?,
@Embedded val address: Address?
)
জাভা
public class Address {
public String street;
public String state;
public String city;
@ColumnInfo(name = "post_code") public int postCode;
}
@Entity
public class User {
@PrimaryKey public int id;
public String firstName;
@Embedded public Address address;
}
একটি User
অবজেক্টের প্রতিনিধিত্বকারী সারণিতে নিম্নলিখিত নামগুলির সাথে কলাম রয়েছে: id
, firstName
, street
, state
, city
, এবং post_code
।
যদি একটি সত্তার একই ধরনের একাধিক এমবেডেড ক্ষেত্র থাকে, তাহলে আপনি prefix
সম্পত্তি সেট করে প্রতিটি কলাম অনন্য রাখতে পারেন। রুম তারপর এমবেড করা বস্তুর প্রতিটি কলাম নামের শুরুতে প্রদত্ত মান যোগ করে।
অতিরিক্ত সম্পদ
রুমের মধ্যে সত্তার মধ্যে সম্পর্ক নির্ধারণ সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন৷
ভিডিও
- রুমে নতুন কি আছে (Android Dev Summit '19)