আপনি যদি চান যে আপনার অ্যাপটি এমন একটি ডেটাবেস দিয়ে শুরু হোক যা ইতিমধ্যেই নির্দিষ্ট ডেটা সেট দিয়ে লোড করা হয়েছে, তাহলে আপনি ডেটাবেসটি আগে থেকেই পপুলেট করতে পারেন। Room-এ, আপনি API ব্যবহার করে, ডিভাইসের ফাইল সিস্টেমে প্রি-প্যাকেজড ডেটাবেস ফাইল থেকে কন্টেন্ট সহ ইনিশিয়ালাইজেশনের সময় ডেটাবেস অটো-ফিল করতে পারবেন।
অ্যাপ অ্যাসেট থেকে অটো-ফিল করা
আপনার অ্যাপের assets/ ডিরেক্টরির যেকোনও জায়গায় অবস্থিত
প্রি-প্যাকেজ করা ডেটাবেস ফাইল থেকে Room ডেটাবেস অটোফিল করতে, build কল করার আগে আপনার RoomDatabase.Builder অবজেক্ট থেকে createFromAsset
ফাংশন কল করুন:
Room.databaseBuilder<AppDatabase>(appContext, "sample.db") .createFromAsset("database/myapp.db") .build()
createFromAsset ফাংশন একটি স্ট্রিং আর্গুমেন্ট গ্রহণ করে যাতে assets/ ডিরেক্টরি থেকে প্রিপ্যাকেজড ডেটাবেস ফাইলের
আপেক্ষিক পাথ থাকে।
ফাইল সিস্টেম থেকে অটো-ফিল করা
ডিভাইসের ফাইল সিস্টেমে কোথাও (আপনার অ্যাপের assets/ ডিরেক্টরি বাদ দিয়ে) আগে থেকে প্যাকেজ করা ডেটাবেস ফাইল থেকে Room ডেটাবেস অটো-ফিল করতে,
build কল করার আগে আপনার RoomDatabase.Builder
অবজেক্ট থেকে createFromFile ফাংশন কল করুন:
Room.databaseBuilder<AppDatabase>(appContext, "sample.db") .createFromFile(File("mypath")) .build()
createFromFile ফাংশনটি আগে থেকে প্যাকেজ করা ডেটাবেস ফাইলের জন্য একটি File আর্গুমেন্ট গ্রহণ করে।
Room সরাসরি খোলার পরিবর্তে নির্দিষ্ট ফাইলের একটি কপি তৈরি করে, তাই আপনার অ্যাপের কাছে ফাইলটি
পড়ার অনুমতি আছে কিনা তা নিশ্চিত করুন।
প্রি-প্যাকেজড ডেটাবেস সহ মাইগ্রেশন ম্যানেজ করা
এছাড়াও, আগে থেকে প্যাকেজ করা ডেটাবেস ফাইলগুলি আপনার Room ডেটাবেস ফলব্যাক মাইগ্রেশন হ্যান্ডেল করার পদ্ধতি পরিবর্তন করতে পারে। সাধারণত, ধ্বংসাত্মক মাইগ্রেশন চালু করা থাকলে এবং মাইগ্রেশন পাথ ছাড়াই Room-কে মাইগ্রেশন করতে হলে, Room ডেটাবেসের সব টেবিল ড্রপ করে দেয় এবং টার্গেট ভার্সনের জন্য নির্দিষ্ট স্কিমা সহ একটি খালি ডেটাবেস তৈরি করে। তবে, টার্গেট ভার্সনের সমান নম্বর সহ কোনও প্রিপ্যাকেজড ডেটাবেস ফাইল অন্তর্ভুক্ত করলে, ধ্বংসাত্মক মাইগ্রেশন পারফর্ম করার পরে, Room নতুন করে তৈরি করা ডেটাবেসকে প্রিপ্যাকেজড ডেটাবেস ফাইলের কন্টেন্ট দিয়ে পূরণ করে।
Room ডেটাবেস মাইগ্রেশন সম্পর্কে আরও জানতে, আপনার Room ডেটাবেস মাইগ্রেট করুন দেখুন।
নিম্নলিখিত বিভাগে, বাস্তবে এটি কীভাবে কাজ করে তার কয়েকটি উদাহরণ দেওয়া হল।
উদাহরণ: আগে থেকে প্যাকেজ করা ডেটাবেস সহ ফলব্যাক মাইগ্রেশন
নিম্নলিখিত বিষয়গুলি বিবেচনা করুন:
- আপনার অ্যাপ ভার্সন ৩-এ একটি রুম ডেটাবেসকে সংজ্ঞায়িত করে।
- ডিভাইসে আগে থেকেই ইনস্টল করা ডেটাবেস ইনস্ট্যান্সটি ভার্সন 2-এ আছে।
- এখানে একটি প্রিপ্যাকেজড ডেটাবেস ফাইল আছে যা ভার্সন ৩-এ আছে।
- ভার্সন ২ থেকে ভার্সন ৩-এ মাইগ্রেশনের কোনও প্রয়োগ করা পাথ নেই।
- ধ্বংসাত্মক মাইগ্রেশন চালু করা আছে।
// Database class definition declaring version 3. @Database(entities = [SampleEntity::class], version = 3) abstract class FallbackAppDatabase : RoomDatabase() { // ... } fun createFallbackDb(appContext: Context) { Room.databaseBuilder<FallbackAppDatabase>(appContext, "sample.db") .createFromAsset("database/myapp.db") .fallbackToDestructiveMigration() .build() }
এই পরিস্থিতিতে কী হয় তা এখানে দেওয়া হল:
- কারণ আপনার অ্যাপে যে ডেটাবেস সংজ্ঞায়িত করা আছে সেটি ভার্সন ৩-এ আছে এবং ডিভাইসে আগে থেকেই ইনস্টল করা ডেটাবেস ইনস্ট্যান্স ভার্সন ২-এ আছে, তাই মাইগ্রেশন প্রয়োজন।
- কারণ, ভার্সন ২ থেকে ভার্সন ৩-এ প্রয়োগ করার মতো কোনও মাইগ্রেশন প্ল্যান নেই, তাই মাইগ্রেশন হল ফলব্যাক মাইগ্রেশন।
- আপনি
fallbackToDestructiveMigrationবিল্ডার ফাংশন কল করার কারণে, ফলব্যাক মাইগ্রেশন ধ্বংসাত্মক। ডিভাইসে ইনস্টল করা ডেটাবেস ইনস্ট্যান্স Room ড্রপ করে। - কারণ, ভার্সন ৩-এ একটি আগে থেকে প্যাকেজ করা ডেটাবেস ফাইল আছে, Room ডেটাবেস আবার তৈরি করে এবং আগে থেকে প্যাকেজ করা ডেটাবেস ফাইলের কন্টেন্ট ব্যবহার করে সেটি পূরণ করে। আপনার আগে থেকে প্যাকেজ করা ডেটাবেস ফাইলটি যদি ভার্সন ২-এ থাকে, তাহলে Room নির্ধারণ করে যে এটি টার্গেট ভার্সনের সাথে মেলে না এবং ফলব্যাক মাইগ্রেশনের জন্য এটি ব্যবহার করে না।
উদাহরণ: আগে থেকে প্যাকেজ করা ডেটাবেস সহ মাইগ্রেশন প্রয়োগ করা হয়েছে
ধরা যাক, আপনার অ্যাপ ভার্সন ২ থেকে ভার্সন ৩-এ মাইগ্রেশন পাথ প্রয়োগ করে:
// Database class definition declaring version 3. @Database(entities = [SampleEntity::class], version = 3) abstract class ImplementedAppDatabase : RoomDatabase() { // ... } // Migration path definition from version 2 to version 3. val MIGRATION_2_3 = object : Migration(2, 3) { override suspend fun migrate(connection: SQLiteConnection) { // ... } } fun createImplementedDb(appContext: Context) { Room.databaseBuilder<ImplementedAppDatabase>(appContext, "sample.db") .createFromAsset("database/myapp.db") .addMigrations(MIGRATION_2_3) .build() }
এই পরিস্থিতিতে কী হয় তা এখানে দেওয়া হল:
- কারণ আপনার অ্যাপে সংজ্ঞায়িত ডেটাবেসটি ভার্সন ৩-এ আছে এবং ডিভাইসে আগে থেকেই ইনস্টল করা ডেটাবেসটি ভার্সন ২-এ আছে, তাই মাইগ্রেশন প্রয়োজন।
- কারণ, ভার্সন ২ থেকে ভার্সন ৩-এ মাইগ্রেশন পাথ প্রয়োগ করা হয়েছে,
ডিভাইসে ডেটাবেস
ইনস্ট্যান্সকে ভার্সন ৩-এ আপডেট করতে, Room আগে থেকেই ডেটাবেসে থাকা ডেটা
সংরক্ষণ করে, সংজ্ঞায়িত
migrateফাংশন রান করায়। Room আগে থেকে প্যাকেজ করা ডেটাবেস ফাইল ব্যবহার করে না, কারণ Room শুধুমাত্র ফলব্যাক মাইগ্রেশনের ক্ষেত্রেই আগে থেকে প্যাকেজ করা ডেটাবেস ফাইল ব্যবহার করে।
উদাহরণ: প্রি-প্যাকেজড ডেটাবেস সহ একাধিক ধাপের মাইগ্রেশন
এছাড়াও, একাধিক ধাপের মাইগ্রেশন প্রি-প্যাকেজড ডেটাবেস ফাইল দ্বারা প্রভাবিত হতে পারে। নিম্নলিখিত বিষয়টি বিবেচনা করুন:
- আপনার অ্যাপ ভার্সন ৪-এ একটি Room ডেটাবেসকে সংজ্ঞায়িত করে।
- ডিভাইসে আগে থেকেই ইনস্টল করা ডেটাবেস ইনস্ট্যান্সটি ভার্সন 2-এ আছে।
- এখানে একটি প্রিপ্যাকেজড ডেটাবেস ফাইল আছে যা ভার্সন ৩-এ আছে।
- ভার্সন ৩ থেকে ভার্সন ৪-এ মাইগ্রেশনের পাথ প্রয়োগ করা হয়েছে, কিন্তু ভার্সন ২ থেকে ভার্সন ৩-এ নয়।
- ধ্বংসাত্মক মাইগ্রেশন চালু করা আছে।
// Database class definition declaring version 4. @Database(entities = [SampleEntity::class], version = 4) abstract class MultiStepAppDatabase : RoomDatabase() { // ... } val MIGRATION_3_4 = object : Migration(3, 4) { override suspend fun migrate(connection: SQLiteConnection) { // ... } } fun createMultiStepDb(appContext: Context) { Room.databaseBuilder<MultiStepAppDatabase>(appContext, "sample.db") .createFromAsset("database/myapp.db") .addMigrations(MIGRATION_3_4) .fallbackToDestructiveMigration() .build() }
এই পরিস্থিতিতে কী হয় তা এখানে দেওয়া হল:
- কারণ আপনার অ্যাপে যে ডেটাবেস সংজ্ঞায়িত করা হয়েছে সেটি ভার্সন ৪-এ আছে এবং ডিভাইসে আগে থেকেই ইনস্টল করা ডেটাবেস ইনস্ট্যান্স ভার্সন ২-এ আছে, তাই মাইগ্রেশন প্রয়োজন।
- কারণ, ভার্সন ২ থেকে ভার্সন ৩-এ কোনও প্রয়োগ করা মাইগ্রেশন পাথ নেই, মাইগ্রেশন হল ফলব্যাক মাইগ্রেশন।
- আপনি
fallbackToDestructiveMigrationবিল্ডার ফাংশন কল করার কারণে, ফলব্যাক মাইগ্রেশন ধ্বংসাত্মক। ডিভাইসে Room ডেটাবেস ইনস্ট্যান্স ড্রপ করে। - কারণ, ভার্সন ৩-এ একটি আগে থেকে প্যাকেজ করা ডেটাবেস ফাইল আছে, Room ডেটাবেস আবার তৈরি করে এবং আগে থেকে প্যাকেজ করা ডেটাবেস ফাইলের কন্টেন্ট ব্যবহার করে সেটি পূরণ করে।
- ডিভাইসে ইনস্টল করা ডেটাবেস এখন ভার্সন ৩-এ আছে। কারণ এটি এখনও আপনার অ্যাপে সংজ্ঞায়িত ভার্সনের চেয়ে কম, তাই আরেকটি মাইগ্রেশন প্রয়োজন।
- কারণ, ভার্সন ৩ থেকে ভার্সন ৪-এ মাইগ্রেশন পাথ প্রয়োগ করা হয়েছে,
ডিভাইসে ডেটাবেস
ইনস্ট্যান্সকে ভার্সন ৪-এ আপডেট করার জন্য Room, আগে থেকে সংজ্ঞায়িত
migrateফাংশন রান করায়, ভার্সন ৩-এর আগে থেকে প্যাকেজ করা ডেটাবেস ফাইল থেকে কপি করা ডেটা এতে সুরক্ষিত থাকে।