আপনার রুম ডাটাবেস প্রস্তুত করুন

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

একটি অ্যাপ সম্পদ থেকে প্রিপুলেট করুন

আপনার অ্যাপের assets/ ডিরেক্টরির যেকোনো স্থানে অবস্থিত একটি প্রিপ্যাকেজড ডাটাবেস ফাইল থেকে একটি রুম ডাটাবেস প্রিপুলেশন করতে, build() কল করার আগে আপনার RoomDatabase.Builder অবজেক্ট থেকে createFromAsset() পদ্ধতিতে কল করুন :

কোটলিন

Room.databaseBuilder(appContext, AppDatabase::class.java, "Sample.db")
    .createFromAsset("database/myapp.db")
    .build()

জাভা

Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
    .createFromAsset("database/myapp.db")
    .build();

createFromAsset() পদ্ধতি একটি স্ট্রিং আর্গুমেন্ট গ্রহণ করে যেটিতে assets/ ডিরেক্টরি থেকে প্রিপ্যাকেজ করা ডাটাবেস ফাইলে একটি আপেক্ষিক পথ রয়েছে।

ফাইল সিস্টেম থেকে প্রিপুলেট করুন

আপনার অ্যাপের assets/ ডিরেক্টরি ব্যতীত ডিভাইসের ফাইল সিস্টেমের যে কোনো জায়গায় অবস্থিত একটি প্রিপ্যাকেজড ডাটাবেস ফাইল থেকে একটি রুম ডাটাবেস প্রিপুলেশন করতে, build() কল করার আগে আপনার RoomDatabase.Builder অবজেক্ট থেকে createFromFile() পদ্ধতিতে কল করুন :

কোটলিন

Room.databaseBuilder(appContext, AppDatabase::class.java, "Sample.db")
    .createFromFile(File("mypath"))
    .build()

জাভা

Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
    .createFromFile(new File("mypath"))
    .build();

createFromFile() পদ্ধতিটি প্রিপ্যাকেজ করা ডাটাবেস ফাইলের জন্য একটি File আর্গুমেন্ট গ্রহণ করে। রুম এটি সরাসরি খোলার পরিবর্তে মনোনীত ফাইলের একটি অনুলিপি তৈরি করে, তাই নিশ্চিত করুন যে আপনার অ্যাপটি ফাইলটিতে পড়ার অনুমতি রয়েছে।

প্রিপ্যাকেজ করা ডাটাবেস অন্তর্ভুক্ত মাইগ্রেশন পরিচালনা করুন

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

রুম ডাটাবেস মাইগ্রেশন সম্পর্কে আরও তথ্যের জন্য, রুম ডাটাবেস মাইগ্রেটিং দেখুন।

নিম্নলিখিত বিভাগগুলি অনুশীলনে এটি কীভাবে কাজ করে তার কয়েকটি উদাহরণ উপস্থাপন করে।

উদাহরণ: একটি প্রিপ্যাকেজড ডাটাবেসের সাথে ফলব্যাক মাইগ্রেশন

নিম্নলিখিত ধরুন:

  • আপনার অ্যাপ সংস্করণ 3-এ একটি রুম ডাটাবেস সংজ্ঞায়িত করে।
  • ডিভাইসে ইতিমধ্যে ইনস্টল করা ডাটাবেস উদাহরণটি সংস্করণ 2-এ রয়েছে।
  • একটি প্রিপ্যাকেজড ডাটাবেস ফাইল রয়েছে যা 3 সংস্করণে রয়েছে।
  • সংস্করণ 2 থেকে সংস্করণ 3 পর্যন্ত কোন বাস্তবায়িত মাইগ্রেশন পথ নেই।
  • ধ্বংসাত্মক মাইগ্রেশন সক্ষম করা হয়েছে৷

কোটলিন

// Database class definition declaring version 3.
@Database(version = 3)
abstract class AppDatabase : RoomDatabase() {
    ...
}

// Destructive migrations are enabled and a prepackaged database
// is provided.
Room.databaseBuilder(appContext, AppDatabase::class.java, "Sample.db")
    .createFromAsset("database/myapp.db")
    .fallbackToDestructiveMigration()
    .build()

জাভা

// Database class definition declaring version 3.
@Database(version = 3)
public abstract class AppDatabase extends RoomDatabase {
    ...
}

// Destructive migrations are enabled and a prepackaged database
// is provided.
Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
    .createFromAsset("database/myapp.db")
    .fallbackToDestructiveMigration()
    .build();

এই পরিস্থিতিতে যা ঘটে তা এখানে:

  1. যেহেতু আপনার অ্যাপে সংজ্ঞায়িত ডাটাবেসটি সংস্করণ 3 তে রয়েছে এবং ডিভাইসে ইতিমধ্যে ইনস্টল করা ডেটাবেস দৃষ্টান্তটি সংস্করণ 2-এ রয়েছে, একটি স্থানান্তর প্রয়োজন৷
  2. যেহেতু সংস্করণ 2 থেকে সংস্করণ 3 পর্যন্ত কোন বাস্তবায়িত মাইগ্রেশন পরিকল্পনা নেই, মাইগ্রেশন একটি ফলব্যাক মাইগ্রেশন।
  3. যেহেতু fallbackToDestructiveMigration() নির্মাতা পদ্ধতি বলা হয়, ফলব্যাক মাইগ্রেশন ধ্বংসাত্মক। রুম ডিভাইসে ইনস্টল করা ডাটাবেস উদাহরণ ড্রপ করে।
  4. যেহেতু একটি প্রিপ্যাকেজড ডাটাবেস ফাইল আছে যা ভার্সন 3-এ রয়েছে, রুম ডাটাবেসটিকে পুনরায় তৈরি করে এবং প্রিপ্যাকেজ করা ডাটাবেস ফাইলের বিষয়বস্তু ব্যবহার করে এটিকে পপুলেট করে। অন্যদিকে, যদি আপনার প্রিপ্যাকেজ করা ডাটাবেস ফাইলটি সংস্করণ 2-এ থাকে, তাহলে রুম লক্ষ্য করবে যে এটি লক্ষ্য সংস্করণের সাথে মেলে না এবং ফলব্যাক মাইগ্রেশনের অংশ হিসেবে এটি ব্যবহার করবে না।

উদাহরণ: একটি প্রিপ্যাকেজড ডাটাবেস সহ বাস্তবায়িত মাইগ্রেশন

এর পরিবর্তে ধরুন যে আপনার অ্যাপটি সংস্করণ 2 থেকে সংস্করণ 3 এ একটি মাইগ্রেশন পথ প্রয়োগ করে:

কোটলিন

// Database class definition declaring version 3.
@Database(version = 3)
abstract class AppDatabase : RoomDatabase() {
    ...
}

// Migration path definition from version 2 to version 3.
val MIGRATION_2_3 = object : Migration(2, 3) {
    override fun migrate(database: SupportSQLiteDatabase) {
        ...
    }
}

// A prepackaged database is provided.
Room.databaseBuilder(appContext, AppDatabase::class.java, "Sample.db")
    .createFromAsset("database/myapp.db")
    .addMigrations(MIGRATION_2_3)
    .build()

জাভা

// Database class definition declaring version 3.
@Database(version = 3)
public abstract class AppDatabase extends RoomDatabase {
    ...
}

// Migration path definition from version 2 to version 3.
static final Migration MIGRATION_2_3 = new Migration(2, 3) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        ...
    }
};

// A prepackaged database is provided.
Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
    .createFromAsset("database/myapp.db")
    .addMigrations(MIGRATION_2_3)
    .build();

এই পরিস্থিতিতে যা ঘটে তা এখানে:

  1. যেহেতু আপনার অ্যাপে সংজ্ঞায়িত ডাটাবেসটি সংস্করণ 3 এবং ডিভাইসে ইতিমধ্যে ইনস্টল করা ডাটাবেসটি সংস্করণ 2-এ রয়েছে, একটি স্থানান্তর প্রয়োজন৷
  2. যেহেতু সংস্করণ 2 থেকে সংস্করণ 3-এ একটি বাস্তবায়িত মাইগ্রেশন পাথ রয়েছে, তাই রুম সংজ্ঞায়িত migrate() পদ্ধতিটি চালায় ডিভাইসে ডেটাবেস ইনস্ট্যান্সকে সংস্করণ 3-এ আপডেট করতে, ডেটাবেসে ইতিমধ্যে থাকা ডেটা সংরক্ষণ করে। রুমটি প্রি-প্যাকেজ করা ডাটাবেস ফাইল ব্যবহার করে না, কারণ রুম শুধুমাত্র একটি ফলব্যাক মাইগ্রেশনের ক্ষেত্রে প্রিপ্যাকেজ করা ডাটাবেস ফাইল ব্যবহার করে।

উদাহরণ: একটি প্রিপ্যাকেজড ডাটাবেস সহ বহু-পদক্ষেপ স্থানান্তর

প্রি-প্যাকেজ করা ডাটাবেস ফাইলগুলি একাধিক ধাপ নিয়ে গঠিত মাইগ্রেশনকেও প্রভাবিত করতে পারে। নিম্নলিখিত ক্ষেত্রে বিবেচনা করুন:

  • আপনার অ্যাপ 4 সংস্করণে একটি রুম ডাটাবেস সংজ্ঞায়িত করে।
  • ডিভাইসে ইতিমধ্যে ইনস্টল করা ডাটাবেস উদাহরণটি সংস্করণ 2-এ রয়েছে।
  • একটি প্রিপ্যাকেজড ডাটাবেস ফাইল রয়েছে যা 3 সংস্করণে রয়েছে।
  • সংস্করণ 3 থেকে সংস্করণ 4 থেকে একটি বাস্তবায়িত মাইগ্রেশন পথ রয়েছে, তবে সংস্করণ 2 থেকে সংস্করণ 3 পর্যন্ত নয়।
  • ধ্বংসাত্মক মাইগ্রেশন সক্ষম করা হয়েছে৷

কোটলিন

// Database class definition declaring version 4.
@Database(version = 4)
abstract class AppDatabase : RoomDatabase() {
    ...
}

// Migration path definition from version 3 to version 4.
val MIGRATION_3_4 = object : Migration(3, 4) {
    override fun migrate(database: SupportSQLiteDatabase) {
        ...
    }
}

// Destructive migrations are enabled and a prepackaged database is
// provided.
Room.databaseBuilder(appContext, AppDatabase::class.java, "Sample.db")
    .createFromAsset("database/myapp.db")
    .addMigrations(MIGRATION_3_4)
    .fallbackToDestructiveMigration()
    .build()

জাভা

// Database class definition declaring version 4.
@Database(version = 4)
public abstract class AppDatabase extends RoomDatabase {
    ...
}

// Migration path definition from version 3 to version 4.
static final Migration MIGRATION_3_4 = new Migration(3, 4) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        ...
    }
};

// Destructive migrations are enabled and a prepackaged database is
// provided.
Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
    .createFromAsset("database/myapp.db")
    .addMigrations(MIGRATION_3_4)
    .fallbackToDestructiveMigration()
    .build();

এই পরিস্থিতিতে যা ঘটে তা এখানে:

  1. যেহেতু আপনার অ্যাপে সংজ্ঞায়িত ডাটাবেসটি 4 সংস্করণে রয়েছে এবং ডিভাইসে ইতিমধ্যে ইনস্টল করা ডেটাবেসটি সংস্করণ 2-এ রয়েছে, একটি স্থানান্তর প্রয়োজন৷
  2. যেহেতু সংস্করণ 2 থেকে সংস্করণ 3 পর্যন্ত কোন বাস্তবায়িত মাইগ্রেশন পথ নেই, তাই মাইগ্রেশন একটি ফলব্যাক মাইগ্রেশন।
  3. যেহেতু fallbackToDestructiveMigration() নির্মাতা পদ্ধতি বলা হয়, ফলব্যাক মাইগ্রেশন ধ্বংসাত্মক। রুম ডিভাইসে ডাটাবেস উদাহরণ ড্রপ.
  4. যেহেতু একটি প্রিপ্যাকেজড ডাটাবেস ফাইল আছে যা ভার্সন 3-এ রয়েছে, রুম ডাটাবেসটিকে পুনরায় তৈরি করে এবং প্রিপ্যাকেজ করা ডাটাবেস ফাইলের বিষয়বস্তু ব্যবহার করে এটিকে পপুলেট করে।
  5. ডিভাইসে ইনস্টল করা ডাটাবেসটি এখন 3 সংস্করণে রয়েছে৷ কারণ এটি এখনও আপনার অ্যাপে সংজ্ঞায়িত সংস্করণের চেয়ে কম, অন্য স্থানান্তর প্রয়োজন৷
  6. যেহেতু সংস্করণ 3 থেকে সংস্করণ 4-এ একটি বাস্তবায়িত মাইগ্রেশন পথ রয়েছে, রুম 3 সংস্করণের প্রিপ্যাকেজড ডাটাবেস ফাইল থেকে কপি করা ডেটা সংরক্ষণ করে ডিভাইসে ডেটাবেস ইনস্ট্যান্সকে সংস্করণ 4-এ আপডেট করার জন্য সংজ্ঞায়িত migrate() পদ্ধতি চালায়।

অতিরিক্ত সম্পদ

একটি রুম ডাটাবেস প্রিপুলেশন সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন।

ভিডিও

ব্লগ