SQLite থেকে রুমে স্থানান্তর করুন

রুম পারসিসটেন্স লাইব্রেরি সরাসরি SQLite API ব্যবহার করে অনেক সুবিধা প্রদান করে:

  • এসকিউএল কোয়েরির কম্পাইল-টাইম যাচাইকরণ
  • সুবিধাজনক টীকা যা পুনরাবৃত্তিমূলক এবং ত্রুটি-প্রবণ বয়লারপ্লেট কোড কমিয়ে দেয়
  • স্ট্রীমলাইনড ডাটাবেস মাইগ্রেশন পাথ

যদি আপনার অ্যাপ বর্তমানে SQLite-এর একটি নন-রুম ইমপ্লিমেন্টেশন ব্যবহার করে, তাহলে রুম ব্যবহার করার জন্য কীভাবে আপনার অ্যাপ মাইগ্রেট করবেন তা জানতে এই পৃষ্ঠাটি পড়ুন। যদি রুমটি প্রথম SQLite বাস্তবায়ন হয় যা আপনি আপনার অ্যাপে ব্যবহার করছেন, তাহলে মৌলিক ব্যবহারের তথ্যের জন্য রুম ব্যবহার করে একটি স্থানীয় ডাটাবেসে ডেটা সংরক্ষণ করুন দেখুন।

মাইগ্রেশন পদক্ষেপ

আপনার SQLite বাস্তবায়নকে রুমে স্থানান্তর করতে নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন৷ যদি আপনার SQLite বাস্তবায়ন একটি বড় ডাটাবেস বা জটিল প্রশ্ন ব্যবহার করে, তাহলে আপনি ধীরে ধীরে রুমে স্থানান্তর করতে পছন্দ করতে পারেন। ক্রমবর্ধমান মাইগ্রেশন কৌশলের জন্য ইনক্রিমেন্টাল মাইগ্রেশন দেখুন।

নির্ভরতা আপডেট করুন

আপনার অ্যাপে রুম ব্যবহার করতে, আপনাকে অবশ্যই আপনার অ্যাপের build.gradle ফাইলে উপযুক্ত নির্ভরতা অন্তর্ভুক্ত করতে হবে। সবচেয়ে আপ-টু-ডেট রুম নির্ভরতার জন্য সেটআপ দেখুন।

ডেটা সত্তায় মডেল ক্লাস আপডেট করুন

রুম ডাটাবেসের টেবিলের প্রতিনিধিত্ব করতে ডেটা সত্তা ব্যবহার করে। প্রতিটি সত্তা শ্রেণী একটি টেবিলের প্রতিনিধিত্ব করে এবং সেই সারণীতে কলামের প্রতিনিধিত্বকারী ক্ষেত্র রয়েছে। আপনার বিদ্যমান মডেল ক্লাসগুলিকে রুম সত্তা হতে আপডেট করতে এই পদক্ষেপগুলি অনুসরণ করুন:

  1. @Entity এর সাথে ক্লাস ডিক্লারেশন টীকা করুন যে এটি একটি রুম এন্টিটি। আপনি ঐচ্ছিকভাবে tableName প্রপার্টি ব্যবহার করতে পারেন ইঙ্গিত করার জন্য যে ফলাফল টেবিলের এমন একটি নাম থাকা উচিত যা ক্লাসের নাম থেকে আলাদা।
  2. @PrimaryKey দিয়ে প্রাথমিক কী ক্ষেত্রটি টীকা করুন।
  3. ফলস্বরূপ টেবিলের যে কোনো কলামের যদি সংশ্লিষ্ট ক্ষেত্রের নামের থেকে আলাদা একটি নাম থাকে, তাহলে @ColumnInfo দিয়ে ক্ষেত্রটিকে টীকা করুন এবং name বৈশিষ্ট্যটি সঠিক কলামের নামে সেট করুন।
  4. যদি ক্লাসে এমন ক্ষেত্র থাকে যা আপনি ডাটাবেসে টিকে থাকতে চান না, তাহলে সেই ক্ষেত্রগুলিকে @Ignore দিয়ে টীকা করুন যে রুম সংশ্লিষ্ট টেবিলে তাদের জন্য কলাম তৈরি করবে না।
  5. যদি ক্লাসে একাধিক কনস্ট্রাক্টর পদ্ধতি থাকে, তাহলে @Ignore এর সাথে অন্যান্য সমস্ত কনস্ট্রাক্টরকে টীকা দিয়ে কোন কনস্ট্রাক্টর রুম ব্যবহার করা উচিত তা নির্দেশ করুন।

কোটলিন

@Entity(tableName = "users")
data class User(
  @PrimaryKey
  @ColumnInfo(name = "userid") val mId: String,
  @ColumnInfo(name = "username") val mUserName: String?,
  @ColumnInfo(name = "last_update") val mDate: Date?,
)

জাভা

@Entity(tableName = "users")
public class User {

  @PrimaryKey
  @ColumnInfo(name = "userid")
  private String mId;

  @ColumnInfo(name = "username")
  private String mUserName;

  @ColumnInfo(name = "last_update")
  private Date mDate;

  @Ignore
  public User(String userName) {
    mId = UUID.randomUUID().toString();
    mUserName = userName;
    mDate = new Date(System.currentTimeMillis());
  }

  public User(String id, String userName, Date date) {
    this.mId = id;
    this.mUserName = userName;
    this.mDate = date;
  }

}

DAOs তৈরি করুন

ডাটাবেস অ্যাক্সেস করে এমন পদ্ধতিগুলিকে সংজ্ঞায়িত করতে রুম ডেটা অ্যাক্সেস অবজেক্ট (DAOs) ব্যবহার করে। আপনার বিদ্যমান ক্যোয়ারী পদ্ধতিগুলিকে DAO-এর সাথে প্রতিস্থাপন করতে রুম DAOs ব্যবহার করে ডেটা অ্যাক্সেস করার নির্দেশিকা অনুসরণ করুন।

একটি ডাটাবেস ক্লাস তৈরি করুন

রুমের বাস্তবায়ন ডাটাবেসের একটি উদাহরণ পরিচালনা করতে একটি ডাটাবেস ক্লাস ব্যবহার করে। আপনার ডাটাবেস ক্লাসের RoomDatabase প্রসারিত করা উচিত এবং আপনার সংজ্ঞায়িত সমস্ত সত্তা এবং DAO-এর উল্লেখ করা উচিত।

কোটলিন

@Database(entities = [User::class], version = 2)
@TypeConverters(DateConverter::class)
abstract class UsersDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

জাভা

@Database(entities = {User.class}, version = 2)
@TypeConverters(DateConverter.class)
public abstract class UsersDatabase extends RoomDatabase {
  public abstract UserDao userDao();
}

একটি মাইগ্রেশন পথ সংজ্ঞায়িত করুন

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

কোটলিন

val MIGRATION_1_2 = object : Migration(1, 2) {
  override fun migrate(database: SupportSQLiteDatabase) {
    // Empty implementation, because the schema isn't changing.
  }
}

জাভা

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
  @Override
  public void migrate(SupportSQLiteDatabase database) {
    // Empty implementation, because the schema isn't changing.
  }
};

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

ডাটাবেস ইনস্ট্যান্টেশন আপডেট করুন

আপনি একটি ডাটাবেস ক্লাস এবং একটি মাইগ্রেশন পাথ সংজ্ঞায়িত করার পরে, আপনি Room.databaseBuilder ব্যবহার করে মাইগ্রেশন পাথ প্রয়োগ করে আপনার ডাটাবেসের একটি উদাহরণ তৈরি করতে পারেন:

কোটলিন

val db = Room.databaseBuilder(
          applicationContext,
          AppDatabase::class.java, "database-name"
        )
          .addMigrations(MIGRATION_1_2).build()

জাভা

db = Room.databaseBuilder(
          context.getApplicationContext(),
          UsersDatabase.class, "database-name"
        )
          .addMigrations(MIGRATION_1_2).build();

আপনার বাস্তবায়ন পরীক্ষা করুন

নিশ্চিত করুন যে আপনি আপনার নতুন রুম বাস্তবায়ন পরীক্ষা করুন:

ক্রমবর্ধমান মাইগ্রেশন

যদি আপনার অ্যাপটি একটি বড়, জটিল ডাটাবেস ব্যবহার করে, তাহলে আপনার অ্যাপটি একবারে রুমে স্থানান্তর করা সম্ভব নাও হতে পারে। পরিবর্তে, আপনি ঐচ্ছিকভাবে প্রথম ধাপ হিসাবে ডেটা সত্তা এবং রুম ডাটাবেস প্রয়োগ করতে পারেন এবং তারপরে আপনার ক্যোয়ারী পদ্ধতিগুলিকে পরে DAO-তে স্থানান্তর করতে পারেন। আপনি RoomDatabase.getOpenHelper() থেকে প্রাপ্ত SupportSQLiteOpenHelper অবজেক্টের সাথে আপনার কাস্টম ডাটাবেস হেল্পার ক্লাস প্রতিস্থাপন করে এটি করতে পারেন।

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

SQLite থেকে রুমে স্থানান্তরিত করার বিষয়ে আরও জানতে, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন:

ব্লগ