Room: یہ کیا ہے، ORM لائبریری اور SQLite کے ساتھ کام کرنا

مصنف: IT Sectr اشاعت: 2026-03-12 مطالعے کا وقت: 10 منٹ

Room Android Jetpack کا ایک ORM لائبریری ہے جو Android پر مقامی ڈیٹابیس کے ساتھ کام کرنے کے لیے SQLite کے اوپر ایک تجریدی پرت فراہم کرتا ہے۔ Android Developers, 2025 کی سرکاری دستاویزات کے مطابق، Room مرتب وقت پر تشریحات کی بنیاد پر خود بخود DAO نفاذ تیار کرتا ہے، جو براہ راست SQLiteOpenHelper کے استعمال کے مقابلے میں تقریباً 70% بائلر پلیٹ کوڈ کو ختم کرتا ہے۔ لائبریری مرتب کرنے کے مرحلے پر SQL استفسار کی توثیق کرتی ہے، جس سے آلہ پر ایپلیکیشن چلانے سے پہلے نحوی غلطیوں کا پتہ لگایا جا سکتا ہے۔

اہم نکات

  • Room Android Jetpack کا ایک ORM لائبریری ہے جو Android ایپلیکیشنز میں مقامی ڈیٹا اسٹوریج کے لیے SQLite کے اوپر تجریدی پرت فراہم کرتا ہے۔
  • تین اہم اجزاء: Entity (جدول کی تعریف)، DAO (ڈیٹا آپریشنز) اور Database (ڈیٹابیس کا داخلہ نقطہ)۔
  • مرتب وقت پر SQL استفسار کی توثیق ایک اہم فائدہ ہے، جو ایپلیکیشن انسٹالیشن سے پہلے غلطیوں کا پتہ لگانے کے قابل بناتا ہے۔
  • ڈیٹابیس میں تبدیلیوں کے رد عمل مشاہدے کے لیے Flow، LiveData اور RxJava کے لیے بلٹ ان سپورٹ۔
  • منتقلی میکانزم پہلے سے محفوظ کردہ صارف ڈیٹا کو کھونے کے بغیر ڈیٹابیس اسکیما کو اپ ڈیٹ کرنے کی اجازت دیتا ہے۔

Room ORM لائبریری کیا ہے؟

Room Android Jetpack کا ایک ORM لائبریری ہے جسے Google نے Android پلیٹ فارم پر مقامی SQLite ڈیٹابیس کے ساتھ کام کو آسان بنانے کے لیے بنایا ہے۔ یہ ڈیٹا اسکیما کو بیان کرنے کے لیے تشریحات فراہم کرتا ہے اور مرتب وقت پر خود بخود DAO انٹرفیس کے نفاذ پیدا کرتا ہے۔ براہ راست SQLiteOpenHelper کے استعمال کے برعکس، Room ڈویلپر کو ڈیٹابیس کنکشن بنانے، کھولنے اور ان کا انتظام کرنے کے لیے نمایاں مقدار میں بائلر پلیٹ کوڈ لکھنے سے آزاد کرتا ہے۔

یہ لائبریری Google I/O 2017 میں Android فن تعمیر کے اجزاء کے حصے کے طور پر پیش کی گئی تھی۔ اس کے بعد سے، Room مقامی ڈیٹا اسٹوریج کے لیے حقیقی معیار بن گیا ہے، جس نے Android کے لیے GreenDAO اور Realm جیسے حل کو مقبولیت میں پیچھے چھوڑ دیا ہے۔ Google کے مطابق، یہ لائبریری Google Play پر شائع ہونے والی 60% سے زیادہ ایپلیکیشنز میں استعمال ہوتی ہے جو آلہ پر مقامی ڈیٹا کے ساتھ کام کرتی ہیں۔

اہم خصوصیت — تشریح پروسیسر کا استعمال کرتے ہوئے مرتب وقت پر SQL استفسار کی توثیق۔ اگر کوئی ڈویلپر SQL کمانڈ میں غلطی کرتا ہے، مثال کے طور پر، ایک غیر موجود کالم نام بتاتا ہے، تو ایپلیکیشن انسٹال ہونے سے پہلے تعمیر ناکام ہو جائے گی۔ یہ SQLiteOpenHelper کے نقطہ نظر سے بنیادی طور پر مختلف ہے، جہاں ایسی غلطیاں صرف رن ٹائم پر، اکثر پروڈکشن میں پائی جاتی ہیں۔

غیر معیاری اقسام کے لیے TypeConverters

SQLite صرف پانچ ڈیٹا کی اقسام کو سپورٹ کرتا ہے: TEXT، INTEGER، REAL، BLOB اور NULL۔ تاہم، Java اور Kotlin میں پیچیدہ اقسام استعمال ہوتی ہیں: Date، List، Enum اور حسب ضرورت اشیاء۔ انہیں محفوظ کرنے کے لیے، Room TypeConverters میکانزم فراہم کرتا ہے — جامد طریقے جو پیچیدہ قسم کو SQLite کے لیے قابل فہم ابتدائی قسم میں تبدیل کرتے ہیں۔ مثال کے طور پر، Date آبجیکٹ Long (ٹائم سٹیمپ) میں اور List<String> Gson یا Moshi کے ذریعے JSON سٹرنگ میں تبدیل ہوتی ہے۔

kotlin
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

val db = Room
    .databaseBuilder(context, AppDatabase::class.java, "app-db")
    .build()

کنورٹر کا اعلان کرنے کے لیے، ایک جامد طریقہ میں @TypeConverter تشریح شامل کرنا اور ڈیٹابیس کی سطح پر @TypeConverters تشریح میں کنورٹر کلاس بتانا کافی ہے۔ Room ہر SQL استفسار میں متعلقہ قسم کو پڑھنے اور لکھنے پر خود بخود کنورٹر کا اطلاق کرتا ہے، دستی طور پر تبدیلی کے طریقوں کو کال کرنے کی ضرورت کے بغیر۔

Room کا فن تعمیر: تین اہم اجزاء

Room تین اہم اجزاء پر مشتمل ہے: Entity، DAO اور Database۔ ہر ایک سختی سے متعین کردار ادا کرتا ہے اور متعلقہ تشریح کے ساتھ تشریح شدہ ہے۔ مل کر، وہ ایک مکمل ڈیٹا تک رسائی کی پرت تشکیل دیتے ہیں جو ایپلیکیشن کے کاروباری منطق کو SQLite کے نفاذ کی تفصیلات سے الگ کرتی ہے۔

Entity — ڈیٹابیس جدول

Entity ایک ڈیٹا کلاس ہے جو ڈیٹابیس میں ایک جدول کی ساخت کو بیان کرتی ہے۔ کلاس کا ہر فیلڈ جدول کے ایک کالم سے مطابقت رکھتا ہے، اور ڈیٹابیس میں ہر قطار کلاس کے ایک مثال سے مطابقت رکھتی ہے۔ @Entity تشریح Room کو بتاتی ہے کہ کلاس ایک جدول ہے۔ @PrimaryKey تشریح والا فیلڈ بنیادی کلید کی وضاحت کرتا ہے، جو خود کار اضافہ یا مرکب ہو سکتی ہے۔ @ForeignKey جدولوں کے درمیان تعلقات کے لیے استعمال ہوتا ہے، ڈیٹابیس کی سطح پر ڈیٹا کی سالمیت کو یقینی بناتا ہے۔

kotlin
@Entity(tableName = "users")
data class User(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,
    @ColumnInfo(name = "full_name")
    val name: String,
    val age: Int,
    val email: String
)

DAO — ڈیٹا آپریشنز

DAO (Data Access Object) ایک انٹرفیس یا تجریدی کلاس ہے جو ڈیٹا کے ساتھ کام کرنے کے لیے آپریشنز کا اعلان کرتی ہے: داخل کرنا، پڑھنا، اپ ڈیٹ کرنا اور حذف کرنا۔ ہر آپریشن @Insert، @Query، @Update یا @Delete سے تشریح شدہ ہے۔ Room مرتب وقت پر اس انٹرفیس کا نفاذ خود بخود تیار کرتا ہے۔ @Query تشریح خاص طور پر قیمتی ہے — یہ SQL استفسار کو سٹرنگ کے طور پر قبول کرتی ہے اور تعمیر کے وقت اس کی درستگی کی توثیق کرتی ہے۔

kotlin
@Dao
interface UserDao {
    @Insert
    suspend fun insert(user: User): Long

    @Query("SELECT * FROM users WHERE id = :userId")
    suspend fun getUserById(userId: Int): User?

    @Query("SELECT * FROM users")
    fun getAllUsers(): Flow<List<User>>

    @Delete
    suspend fun delete(user: User)
}

Database — داخلہ نقطہ

Database ایک تجریدی کلاس ہے جو RoomDatabase کو بڑھاتی ہے اور ڈیٹابیس کے داخلہ نقطہ کے طور پر کام کرتی ہے۔ اس میں تمام Entities کی فہرست ہوتی ہے اور DAOs حاصل کرنے کے لیے تجریدی طریقے فراہم کرتی ہے۔ کلاس @Database سے تشریح شدہ ہے، جو اسکیما ورژن اور ہستیوں کی فہرست بتاتی ہے۔ ڈیٹابیس مثال ایپلیکیشن سیاق و سباق، فائل نام اور Database کلاس کے ساتھ Room.databaseBuilder کے ذریعے بنائی جاتی ہے۔

Room SQLite کے ساتھ اندرونی طور پر کیسے کام کرتا ہے

Room SQLite کو تبدیل نہیں کرتا، بلکہ اس کے اوپر ایک تجریدی پرت کے طور پر کام کرتا ہے۔ اندرونی فن تعمیر میں تشریح پروسیسر، کوڈ جنریٹر اور کنکشن پول شامل ہیں۔ مرتب وقت پر، تشریح پروسیسر Entity، DAO اور Database کلاسز کا تجزیہ کرتا ہے، پھر _Impl لاحقہ کے ساتھ نفاذ کلاسز تیار کرتا ہے۔ تمام تیار کردہ کلاسز تعمیر پیکیج میں رکھی جاتی ہیں اور ڈویلپر کو براہ راست نظر نہیں آتیں۔

مرتب وقت پر کوڈ جنریشن Room کا مرکزی میکانزم ہے۔ ہر DAO انٹرفیس کے لیے، تمام تشریح شدہ طریقوں کے مکمل نفاذ کے ساتھ ایک کلاس تیار کی جاتی ہے۔ @Query تشریح سے SQL استفسارات درستگی کے لیے تصدیق کی جاتی ہیں: پروسیسر کالم ناموں کو Entity فیلڈز سے ملانے اور SQL نحو کی جانچ کرتا ہے۔ اگر غلطی پائی جاتی ہے تو، تعمیر ایک واضح پیغام کے ساتھ روک دی جاتی ہے۔ یہ خام SQLiteOpenHelper استعمال کرتے وقت ممکن نہیں ہے، جہاں غلطیاں صرف رن ٹائم پر ظاہر ہوتی ہیں۔

مرتب وقت پر کوڈ جنریشن

جنریشن کے عمل میں تین مراحل شامل ہیں۔ پہلا — اسکیما توثیق: پروسیسر چیک کرتا ہے کہ @Database میں درج تمام کلاسز درست Entities ہیں۔ دوسرا — DAO باڈی جنریشن: ہر طریقہ کے لیے، اندرونی RoomSQLiteQuery آبجیکٹ کا استعمال کرتے ہوئے ایک نفاذ بنایا جاتا ہے جو تیار کردہ استفسارات کو انجام دیتا ہے۔ تیسرا — Database_Impl کلاس کی جنریشن، جو ڈیٹابیس کی تخلیق اور کھولنے کے ساتھ ساتھ تمام DAO اشیاء کی ابتداء کو سنبھالتی ہے۔

kotlin
class UserDao_Impl(private val __db: RoomDatabase) : UserDao {
    private val __insertionAdapter = __db
        .createInsertionAdapter(User::class, 0)

    override suspend fun insert(user: User): Long {
        __db.assertNotSuspendingTransaction()
        return __db.runInTransaction {
            __insertionAdapter.insertAndReturnId(user)
        }
    }
}

Room ڈیٹابیس آپریشنز کے لیے علیحدہ تھریڈ پول نہیں بناتا۔ ڈیفالٹ طور پر، استفسارات کالنگ تھریڈ میں ایک حد کے ساتھ انجام دی جاتی ہیں: پڑھنا اور لکھنا تھریڈ کو روکتا ہے۔ غیر مطابقت پذیر کام کے لیے، Room Kotlin کوروٹینز کے ساتھ suspend فنکشنز کے ذریعے، LiveData کے ساتھ واپسی قدروں کے ذریعے، اور Flow کے ساتھ رد عمل لپیٹنے والوں کے ذریعے مربوط ہوتا ہے۔ یہ ڈویلپر کو کسی خاص کام کے لیے فن تعمیر کا حل منتخب کرنے کی لچک دیتا ہے۔

Android ایپلیکیشن میں Room استعمال کرنے کی مثال

آئیے Room کا استعمال کرتے ہوئے نوٹس محفوظ کرنے والی ایپلیکیشن بنانے کی ایک عملی مثال دیکھتے ہیں۔ ایپلیکیشن میں id، title، content اور timestamp فیلڈز کے ساتھ ایک Note جدول ہے۔ صارف نوٹس شامل کر سکتے ہیں، دیکھ سکتے ہیں اور حذف کر سکتے ہیں۔ غیر مطابقت پذیر آپریشنز کے لیے کوروٹینز استعمال کی جاتی ہیں۔

Gradle انحصار ترتیب دینا

Android پروجیکٹ میں Room کو ضم کرنے کے لیے، ماڈیول سطح کی build.gradle فائل میں انحصار شامل کریں۔ Room کو تین اجزاء کی ضرورت ہے: رن ٹائم لائبریری، kapt تشریح پروسیسر اور اختیاری کوروٹین سپورٹ۔ لائبریری ورژن آسان اپ ڈیٹ کے لیے room_version متغیر میں بتایا جاتا ہے۔ Room 2.4.0 سے شروع کرکے، تیز تر تعمیر کی رفتار کے ساتھ kapt کے متبادل کے طور پر KSP تعاون یافتہ ہے۔

groovy
dependencies {
    def room_version = "2.6.1"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    implementation "androidx.room:room-ktx:$room_version"
    // اختیاری: جانچ
    testImplementation "androidx.room:room-testing:$room_version"
}

انحصار ترتیب دینے کے بعد، تین فائلیں بنائیں: Note Entity، NoteDao انٹرفیس اور AppDatabase کلاس۔ Note Entity میں @PrimaryKey اور @ColumnInfo تشریحات والے فیلڈز ہیں۔ DAO داخل کرنے، فہرست حاصل کرنے اور حذف کرنے کے طریقے فراہم کرتا ہے۔ Database @Database تشریح کے ذریعے Entity اور DAO کو جوڑتا ہے۔

kotlin
@Entity(tableName = "notes")
data class Note(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,
    val title: String,
    val content: String,
    @ColumnInfo(name = "created_at")
    val timestamp: Long = System.currentTimeMillis()
)

@Dao
interface NoteDao {
    @Insert
    suspend fun insert(note: Note)

    @Query("SELECT * FROM notes ORDER BY created_at DESC")
    fun getAllNotes(): Flow<List<Note>>

    @Delete
    suspend fun delete(note: Note)
}

AppDatabase فائل RoomDatabase کو بڑھانے والی ایک تجریدی کلاس کے طور پر اعلان کی جاتی ہے۔ @Database تشریح موجودہ ورژن کے لیے تمام Entities اور اسکیما ورژن نمبر بتاتی ہے۔ مثال حاصل کرنے کے لیے، ایپلیکیشن سیاق و سباق کے ساتھ Room.databaseBuilder کے build طریقہ کے ذریعے سنگلٹن پیٹرن استعمال کیا جاتا ہے۔ ڈیٹابیس مثال کو کیش کرنا متعدد تخلیقات کو روکتا ہے جو میموری لیک کا سبب بن سکتی ہیں۔

Room میں ڈیٹابیس منتقلی

منتقلی Room میں موجودہ ڈیٹا کو کھونے کے بغیر ایپلیکیشن کو اپ ڈیٹ کرتے وقت ڈیٹابیس اسکیما کو تبدیل کرنے کا ایک میکانزم ہے۔ جب صارف تبدیل شدہ Entities کے ساتھ ایک نیا ورژن انسٹال کرتا ہے، Room ورژن کی مماثلت کا پتہ لگاتا ہے اور بتائے گئے منتقلی کے مراحل انجام دیتا ہے۔ منتقلی کے بغیر، ڈیٹابیس حذف ہو جائے گا اور دوبارہ بنایا جائے گا، جس کے نتیجے میں صارف کے تمام محفوظ کردہ ڈیٹا کا نقصان ہوگا۔

منتقلی Migration کلاس کے ذریعے بیان کی جاتی ہے، جو ڈیٹابیس کے شروع اور اختتامی ورژن لیتی ہے۔ migrate طریقہ کے اندر، اسکیما کو تبدیل کرنے کے لیے ALTER TABLE یا CREATE TABLE SQL استفسار انجام دیا جاتا ہے۔ Room خود بخود اسکیما تبدیلیوں کا پتہ نہیں لگا سکتا — ڈویلپر کو ہر Entity تبدیلی کے لیے دستی طور پر منتقلی لکھنی ہوگی۔ Room 2.4.0 سے شروع کرکے، خودکار منتقلی پیدا کرنے کے لیے تجرباتی autoMigrations فیچر دستیاب ہے۔

autoMigrations کے ساتھ خودکار منتقلی

autoMigrations فیچر Room کو Entity ورژن کے درمیان فرق کی بنیاد پر خود بخود منتقلی پیدا کرنے کی اجازت دیتا ہے۔ اسے استعمال کرنے کے لیے، @Database میں @AutoMigration تشریح شامل کرنا اور JSON میں اسکیما برآمد کو فعال کرنا کافی ہے۔ Room ملحقہ ورژن کے اسکیما کا موازنہ کرتا ہے اور ضروری ALTER استفسارات پیدا کرتا ہے۔ تاہم، autoMigrations صرف پسماندہ مطابقت رکھنے والی تبدیلیوں کو سپورٹ کرتا ہے: کالم شامل کرنا، انڈیکس بنانا اور مطابقت پذیر تبدیلیوں کے ساتھ اقسام کو تبدیل کرنا۔

kotlin
val MIGRATION_1_2 = object : Migration(1, 2) {
    override fun migrate(db: SupportSQLiteDatabase) {
        db.execSQL(
            "ALTER TABLE users ADD COLUMN phone TEXT"
        )
    }
}

val db = Room
    .databaseBuilder(context, AppDatabase::class.java, "app-db")
    .addMigrations(MIGRATION_1_2)
    .build()

پیچیدہ تبدیلیوں کے لیے، جیسے کالموں کا نام تبدیل کرنا یا جدولوں کو ضم کرنا، درمیانی جدولوں کا استعمال کرتے ہوئے دستی منتقلی کی ضرورت ہے۔ ایک عام منظر نامہ: پرانے اسکیما کے ساتھ ایک عارضی جدول بنائیں، پرانے جدول سے نئے میں تبدیلیوں کے ساتھ ڈیٹا کاپی کریں، پرانا جدول حذف کریں اور عارضی کا نام تبدیل کریں۔ Room ضمانت دیتا ہے کہ تمام منتقلی ایک ہی لین دین میں انجام پائیں، اور اگر غلطی ہوتی ہے تو تبدیلیاں مکمل طور پر واپس لے لی جاتی ہیں۔

اکثر پوچھے گئے سوالات

Room SQLiteOpenHelper سے کیسے مختلف ہے؟

Room تشریحات اور مرتب وقت پر SQL توثیق کے ساتھ ORM تجرید فراہم کرتا ہے، جبکہ SQLiteOpenHelper کو تمام استفسارات دستی طور پر لکھنے اور کنکشن کا انتظام کرنے کی ضرورت ہوتی ہے۔ Room CRUD آپریشنز کے لیے خود بخود کوڈ تیار کرتا ہے اور Android فن تعمیر کے اجزاء، بشمول LiveData اور Flow، کے ساتھ ضم ہوتا ہے۔

Room کس ڈیٹا کی اقسام کو سپورٹ کرتا ہے؟

Room تمام Java ابتدائی اقسام کو سپورٹ کرتا ہے: Int، Long، Boolean، Float، Double کے ساتھ ساتھ String، ByteArray اور Date۔ List یا Enum جیسی پیچیدہ اقسام کے لیے، TypeConverters استعمال ہوتے ہیں — جامد تبدیلی کے طریقے جو غیر معیاری اقسام کو SQLite مطابقت پذیر فارمیٹس میں تبدیل کرتے ہیں۔

کیا Room کوروٹینز کے بغیر استعمال کیا جا سکتا ہے؟

ہاں، Room کوروٹینز کے بغیر ہم وقت ساز کالز کو سپورٹ کرتا ہے، لیکن وہ اس تھریڈ کو روکتے ہیں جس پر وہ چلتے ہیں۔ غیر مطابقت پذیر کام کے لیے، آپ کوروٹینز کے بجائے LiveData یا RxJava استعمال کر سکتے ہیں۔ Google نئے پروجیکٹس میں غیر مطابقت پذیر ڈیٹا تک رسائی کے بنیادی طریقہ کے طور پر کوروٹینز استعمال کرنے کی تجویز کرتا ہے۔

منتقلی کی عدم موجودگی میں کیا ہوتا ہے؟

اگر Room ڈیٹابیس ورژن کی مماثلت کا پتہ لگاتا ہے اور مناسب منتقلی نہیں پاتا ہے، تو ڈیفالٹ طور پر یہ غلطی کی وضاحت کے ساتھ IllegalStateException پھینکتا ہے۔ ڈویلپر fallbackToDestructiveMigration طریقہ سے اس رویے کو اوور رائڈ کر سکتا ہے، جو موجودہ ڈیٹابیس کو حذف کرے گا اور تمام ڈیٹا کھوتے ہوئے ایک نیا بنائے گا۔

Room جدولوں کے درمیان تعلقات کو کیسے سنبھالتا ہے؟

Room @Embedded تشریح کے ساتھ نیسٹڈ آبجیکٹ اور @Relation تشریح کے ساتھ تعلق کلاسز کے ذریعے تعلقات کو سپورٹ کرتا ہے۔ جدول جوائن پر مشتمل پیچیدہ استفسارات کے لیے، حسب ضرورت POJO کلاسز استعمال ہوتی ہیں، جن کے فیلڈز SQL JOIN بیانات کے ساتھ @Query کے نتائج سے بھرے جاتے ہیں۔

خلاصہ

  • Room Android Jetpack کا ایک ORM لائبریری ہے جو آلہ پر آسان ڈیٹا اسٹوریج کے لیے SQLite کے اوپر ایک تجریدی پرت بناتا ہے۔
  • فن تعمیر تین اجزاء پر مبنی ہے: Entity (جدول اسکیما)، DAO (آپریشنز) اور Database (داخلہ نقطہ)۔
  • مرتب وقت پر SQL استفسار کی توثیق بنیادی فائدہ ہے، جو استفسارات میں رن ٹائم غلطیوں کو ختم کرتا ہے۔
  • Flow، LiveData اور RxJava کے لیے بلٹ ان سپورٹ ڈیٹا تبدیل ہونے پر خودکار UI اپ ڈیٹس کے ساتھ رد عمل فن تعمیر بنانے کے قابل بناتا ہے۔
  • Room میں منتقلی محفوظ کردہ صارف کی معلومات کو کھونے کے بغیر ڈیٹابیس اسکیما کی ہموار اپ ڈیٹس کو یقینی بناتی ہے۔
  • لائبریری Kotlin کوروٹینز کے ساتھ suspend فنکشنز کے ذریعے ضم ہوتی ہے، ڈیٹا کے ساتھ غیر مطابقت پذیر کام کو آسان بناتی ہے۔
  • نئے پروجیکٹس کے لیے، Room Android پر مقامی ڈیٹا اسٹوریج کے لیے Google کی سرکاری طور پر تجویز کردہ حل ہے۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں