রুম নেই না অন্তত পর্যন্ত একটি ভাল মাইগ্রেশন সিস্টেম আছে, 2.1.0-alpha03।
সুতরাং, যতক্ষণ না আমাদের আরও ভাল মাইগ্রেশন সিস্টেম রয়েছে, ততক্ষণে রুমে সহজভাবে মাইগ্রেশন করার জন্য কিছু কার্যক্রম রয়েছে।
যেহেতু @Database(createNewTables = true) বা যেমন MigrationSystem.createTable(User::class), যেখানে এক বা অন্য হওয়া উচিত সেখানে কোনও পদ্ধতি নেই , একমাত্র সম্ভাব্য পথ চলছে
CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))
আপনার migrateপদ্ধতির ভিতরে ।
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))")
}
}
এসকিউএল স্ক্রিপ্টের উপরে উঠতে আপনার কাছে 4 টি উপায় রয়েছে
1. নিজের দ্বারা লিখুন
মূলত, আপনাকে উপরের স্ক্রিপ্টটি লিখতে হবে যা ঘরটি তৈরি করা স্ক্রিপ্টটির সাথে মিলবে। এই উপায় সম্ভব, সম্ভাব্য নয়। (আপনার 50 টি ক্ষেত্র রয়েছে তা বিবেচনা করুন)
2. রফতানি স্কিমা
আপনি যদি exportSchema = trueআপনার @Databaseটীকাটির অন্তর্ভুক্ত করেন , ঘরটি আপনার প্রকল্প ফোল্ডারের / স্কিমার মধ্যে ডাটাবেস স্কিমা তৈরি করবে। ব্যবহার হয়
@Database(entities = [User::class], version = 2, exportSchema = true)
abstract class AppDatabase : RoomDatabase {
}
নিশ্চিত হয়ে নিন যে আপনি build.gradeনিজের অ্যাপ্লিকেশন মডিউলটির নীচে লাইন অন্তর্ভুক্ত করেছেন
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas".toString())
}
}
আপনি যখন প্রকল্পটি চালাবেন বা নির্মাণ করবেন আপনি একটি জেএসওএন ফাইল পাবেন 2.json, এতে আপনার রুমের ডাটাবেসের মধ্যে সমস্ত প্রশ্ন রয়েছে।
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "325bd539353db508c5248423a1c88c03",
"entities": [
{
"tableName": "User",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
সুতরাং, আপনি createSqlআপনার migrateপদ্ধতির মধ্যে উপরেরটি অন্তর্ভুক্ত করতে পারেন ।
৩. অ্যাপড্যাটাস ডাটা_আইএমপিএল থেকে কোয়েরি পান
আপনি যদি স্কিমা রফতানি করতে না চান তবে আপনি প্রকল্পটি চালিয়ে বা বিল্ডিং করে কোয়েরিটি পেতে পারেন যা AppDatabase_Impl.javaফাইল উত্পন্ন করবে । এবং নির্দিষ্ট ফাইলের মধ্যে আপনার থাকতে পারে।
@Override
public void createAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))");
createAllTablesপদ্ধতির মধ্যে , সমস্ত সত্তার তৈরি স্ক্রিপ্টগুলি থাকবে। আপনি এটি পেতে পারেন এবং আপনার migrateপদ্ধতির মধ্যে অন্তর্ভুক্ত করতে পারেন ।
৪. টিকা প্রক্রিয়াকরণ।
আপনি অনুমান করতে পারে, রুম এর উপরে উল্লিখিত সব উত্পন্ন schema, এবং AppDatabase_Implসংকলন সময়ের মধ্যে ও টীকার প্রসেসিং ফাইল যা আপনার সাথে যোগ
kapt "androidx.room:room-compiler:$room_version"
তার অর্থ আপনি একই কাজটি করতে পারেন এবং আপনার নিজস্ব এনোটেশন প্রক্রিয়াকরণ লাইব্রেরি তৈরি করতে পারেন যা আপনার জন্য প্রয়োজনীয় সমস্ত তৈরি প্রশ্ন তৈরি করে।
ধারণা রুম টীকা জন্য একটি টীকা প্রক্রিয়াকরণ গ্রন্থাগার করা হয় @Entityএবং @Database। @Entityউদাহরণস্বরূপ টীকায়িত এমন একটি ক্লাস নিন । এই পদক্ষেপগুলি আপনাকে অনুসরণ করতে হবে
- একটি নতুন
StringBuilderতৈরি করুন এবং "উপস্থিত না থাকলে টেবিল তৈরি করুন" যুক্ত করুন
- ক্ষেত্র থেকে
class.simplenameবা tableNameক্ষেত্রের দ্বারা সারণির নাম পান @Entity। এটি আপনার যুক্ত করুনStringBuilder
- তারপরে আপনার শ্রেণীর প্রতিটি ক্ষেত্রের জন্য এসকিউএল এর কলাম তৈরি করুন। ক্ষেত্রের নাম বা টাইপ করুন, ক্ষেত্রটি নিজেই বা
@ColumnInfoটীকা দ্বারা n প্রতিটি ক্ষেত্রের জন্য, আপনাকে নিজের id INTEGER NOT NULLকলামের স্টাইল যুক্ত করতে হবে StringBuilder।
- এর মাধ্যমে প্রাথমিক কী যুক্ত করুন
@PrimaryKey
- যোগ করুন
ForeignKeyএবং Indicesযদি উপস্থিত থাকে।
- শেষ করার পরে এটিকে স্ট্রিংয়ে রূপান্তর করুন এবং এটি ব্যবহার করতে চান এমন কোনও নতুন শ্রেণিতে সংরক্ষণ করুন। উদাহরণস্বরূপ, নীচের মত এটি সংরক্ষণ করুন
public final class UserSqlUtils {
public String createTable = "CREATE TABLE IF NOT EXISTS User (id INTEGER, PRIMARY KEY(id))";
}
তারপরে, আপনি এটি হিসাবে ব্যবহার করতে পারেন
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL(UserSqlUtils().createTable)
}
}
আমি নিজের জন্য এমন একটি লাইব্রেরি তৈরি করেছি যা আপনি যাচাই করতে পারেন, এমনকি এটি আপনার প্রকল্পেও ব্যবহার করতে পারেন। মনে রাখবেন যে আমি যে লাইব্রেরিটি তৈরি করেছি তা পূর্ণ নয় এবং এটি কেবল সারণী তৈরির জন্য আমার প্রয়োজনীয়তা পূরণ করে।
ভাল অভিবাসনের জন্য রুমএক্সটেনশন
রুমএক্সটেনশন ব্যবহার করে এমন অ্যাপ্লিকেশন
আশা করি এটি কার্যকর ছিল।
হালনাগাদ
এই উত্তরটি লেখার সময়, রুম সংস্করণ ছিল 2.1.0-alpha03এবং আমি বিকাশকারীদের ইমেল করার সময় আমি এর প্রতিক্রিয়া পেয়েছিলাম
এটিতে আরও ভাল মাইগ্রেশন সিস্টেম থাকবে বলে আশা করা হচ্ছে 2.2.0
দুর্ভাগ্যক্রমে, আমাদের এখনও আরও ভাল মাইগ্রেশন সিস্টেমের অভাব রয়েছে।