Room का इस्तेमाल करके, डेटा को किसी स्थानीय डेटाबेस में सेव करना   Android Jetpack का हिस्सा.

Kotlin Multiplatform का इस्तेमाल करके देखें
Kotlin Multiplatform की मदद से, डेटाबेस लेयर को अन्य प्लैटफ़ॉर्म के साथ शेयर किया जा सकता है. KMP में Room Database को सेट अप करने और उसका इस्तेमाल करने का तरीका जानें

ऐसे ऐप्लिकेशन जो स्ट्रक्चर्ड डेटा की बड़ी मात्रा को मैनेज करते हैं उन्हें डेटा को स्थानीय तौर पर सेव करने से काफ़ी फ़ायदा मिल सकता है. इसका सबसे आम इस्तेमाल, काम के डेटा को कैश मेमोरी में सेव करना है. इससे जब डिवाइस नेटवर्क को ऐक्सेस नहीं कर पाता है, तब भी उपयोगकर्ता ऑफ़लाइन होने पर उस कॉन्टेंट को ब्राउज़ कर सकता है.

Room परसिस्टेंस लाइब्रेरी, SQLite को लेकर एक ऐब्स्ट्रैक्शन लेयर उपलब्ध कराती है, ताकि डेटाबेस को ज़्यादा अच्छे से ऐक्सेस किया जा सके. खास तौर पर, Room से ये फ़ायदे मिलते हैं:

  • एसक्यूएल क्वेरी के कंपाइल होने में लगने वाले समय की पुष्टि.
  • सुविधा देने वाले एनोटेशन, जो बार-बार इस्तेमाल किए जाने वाले और गड़बड़ी होने की आशंका वाले बॉयलरप्लेट कोड को कम करते हैं.
  • डेटाबेस माइग्रेशन के बेहतर पाथ.

इन बातों को ध्यान में रखते हुए, हमारा सुझाव है कि आप SQLite API का सीधे तौर पर इस्तेमाल करने के बजाय, Room का इस्तेमाल करें.

सेटअप

अपने ऐप्लिकेशन में Room का इस्तेमाल करने के लिए, अपने ऐप्लिकेशन की build.gradle फ़ाइल में ये डिपेंडेंसी जोड़ें.

Kotlin

dependencies {
    val room_version = "2.7.2"

    implementation("androidx.room:room-runtime:$room_version")

    // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP)
    // See Add the KSP plugin to your project
    ksp("androidx.room:room-compiler:$room_version")

    // If this project only uses Java source, use the Java annotationProcessor
    // No additional plugins are necessary
    annotationProcessor("androidx.room:room-compiler:$room_version")

    // optional - Kotlin Extensions and Coroutines support for Room
    implementation("androidx.room:room-ktx:$room_version")

    // optional - RxJava2 support for Room
    implementation("androidx.room:room-rxjava2:$room_version")

    // optional - RxJava3 support for Room
    implementation("androidx.room:room-rxjava3:$room_version")

    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation("androidx.room:room-guava:$room_version")

    // optional - Test helpers
    testImplementation("androidx.room:room-testing:$room_version")

    // optional - Paging 3 Integration
    implementation("androidx.room:room-paging:$room_version")
}

ग्रूवी

dependencies {
    def room_version = "2.7.2"

    implementation "androidx.room:room-runtime:$room_version"

    // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP)
    // See KSP Quickstart to add KSP to your build
    ksp "androidx.room:room-compiler:$room_version"

    // If this project only uses Java source, use the Java annotationProcessor
    // No additional plugins are necessary
    annotationProcessor "androidx.room:room-compiler:$room_version"

    // optional - RxJava2 support for Room
    implementation "androidx.room:room-rxjava2:$room_version"

    // optional - RxJava3 support for Room
    implementation "androidx.room:room-rxjava3:$room_version"

    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation "androidx.room:room-guava:$room_version"

    // optional - Test helpers
    testImplementation "androidx.room:room-testing:$room_version"

    // optional - Paging 3 Integration
    implementation "androidx.room:room-paging:$room_version"
}

मुख्य कॉम्पोनेंट

रूम में तीन बड़े कॉम्पोनेंट हैं:

  • डेटाबेस क्लास, जिसमें डेटाबेस होता है. साथ ही, यह आपके ऐप्लिकेशन के बरकरार रखे गए डेटा तक जाने के लिए, मूल कनेक्शन का मुख्य ऐक्सेस पॉइंट होता है.
  • डेटा एंटिटी, जो आपके ऐप्लिकेशन के डेटाबेस में मौजूद टेबल को दिखाती हैं.
  • डेटा ऐक्सेस ऑब्जेक्ट (डीएओ). ये ऐसे ऑब्जेक्ट होते हैं जो आपके ऐप्लिकेशन को डेटाबेस में मौजूद डेटा को क्वेरी करने, अपडेट करने, इंसर्ट करने, और मिटाने के तरीके उपलब्ध कराते हैं.

डेटाबेस क्लास, आपके ऐप्लिकेशन को उस डेटाबेस से जुड़े डीएओ के इंस्टेंस उपलब्ध कराती है. इसके बाद, ऐप्लिकेशन डीएओ का इस्तेमाल करके, डेटाबेस से डेटा को उससे जुड़ी डेटा इकाई के ऑब्जेक्ट के इंस्टेंस के तौर पर वापस पा सकता है. ऐप्लिकेशन, तय की गई डेटा इकाइयों का इस्तेमाल करके, उनसे जुड़ी टेबल की पंक्तियों को अपडेट कर सकता है. इसके अलावा, नई पंक्तियां जोड़ने के लिए भी इनका इस्तेमाल किया जा सकता है. पहली इमेज में, Room के अलग-अलग कॉम्पोनेंट के बीच का संबंध दिखाया गया है.

पहली इमेज. Room लाइब्रेरी के आर्किटेक्चर का डायग्राम.

लागू करने का उदाहरण

इस सेक्शन में, एक डेटा इकाई और एक डीएओ के साथ Room डेटाबेस को लागू करने का उदाहरण दिया गया है.

डेटा इकाई

नीचे दिए गए कोड में, User डेटा इकाई के बारे में बताया गया है. User का हर इंस्टेंस, ऐप्लिकेशन के डेटाबेस में मौजूद user टेबल की एक लाइन को दिखाता है.

Kotlin

@Entity
data class User(
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)

Java

@Entity
public class User {
    @PrimaryKey
    public int uid;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;
}

Room में डेटा इकाइयों के बारे में ज़्यादा जानने के लिए, Room इकाइयों का इस्तेमाल करके, डेटा के बारे में बताना लेख पढ़ें.

डेटा ऐक्सेस ऑब्जेक्ट (डीएओ)

नीचे दिए गए कोड में, UserDao नाम के DAO को परिभाषित किया गया है. UserDao, ऐसे तरीके उपलब्ध कराता है जिनका इस्तेमाल करके, ऐप्लिकेशन के बाकी हिस्से user टेबल में मौजूद डेटा के साथ इंटरैक्ट करते हैं.

Kotlin

@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAll(): List<User>

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    fun loadAllByIds(userIds: IntArray): List<User>

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
           "last_name LIKE :last LIMIT 1")
    fun findByName(first: String, last: String): User

    @Insert
    fun insertAll(vararg users: User)

    @Delete
    fun delete(user: User)
}

Java

@Dao
public interface UserDao {
    @Query("SELECT * FROM user")
    List<User> getAll();

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    List<User> loadAllByIds(int[] userIds);

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
           "last_name LIKE :last LIMIT 1")
    User findByName(String first, String last);

    @Insert
    void insertAll(User... users);

    @Delete
    void delete(User user);
}

डीएओ के बारे में ज़्यादा जानने के लिए, Room के डीएओ इस्तेमाल करके डेटा ऐक्सेस करना लेख पढ़ें.

डेटाबेस

नीचे दिए गए कोड में, डेटाबेस को सेव करने के लिए AppDatabase क्लास को तय किया गया है. AppDatabase, डेटाबेस कॉन्फ़िगरेशन के बारे में बताता है. साथ ही, यह ऐप्लिकेशन के बरकरार रखे गए डेटा का मुख्य ऐक्सेस पॉइंट होता है. डेटाबेस क्लास को इन शर्तों को पूरा करना होगा:

  • क्लास को @Database एनोटेशन के साथ एनोटेट किया जाना चाहिए. इसमें entities ऐरे शामिल होता है. इस ऐरे में, डेटाबेस से जुड़ी सभी डेटा इकाइयों की सूची होती है.
  • क्लास, ऐसी ऐब्स्ट्रैक्ट क्लास होनी चाहिए जो RoomDatabase को एक्सटेंड करती हो.
  • डेटाबेस से जुड़ी हर डीएओ क्लास के लिए, डेटाबेस क्लास को एक ऐब्सट्रैक्ट मैथड तय करना होगा. इसमें कोई आर्ग्युमेंट नहीं होता और यह डीएओ क्लास का इंस्टेंस दिखाता है.

Kotlin

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

Java

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

ध्यान दें: अगर आपका ऐप्लिकेशन किसी सिंगल प्रोसेस में चलता है, तो आपको कोई AppDatabase ऑब्जेक्ट इंस्टैंशिएट करते समय, सिंगलटन डिज़ाइन पैटर्न अपनाना चाहिए. हर RoomDatabase इंस्टेंस ज़्यादा महंगा नहीं होता है और आपको किसी एक प्रोसेस में, एक से ज़्यादा इंस्टेंस ऐक्सेस करने की शायद ही ज़रूरत पड़े.

अगर आपका ऐप्लिकेशन एक से ज़्यादा प्रोसेस में चलता है, तो अपने डेटाबेस बिल्डर इनवोकेशन में enableMultiInstanceInvalidation() शामिल करें. इस तरह, हर प्रोसेस में AppDatabase का एक इंस्टेंस होने पर, किसी एक प्रोसेस में शेयर की गई डेटाबेस फ़ाइल को अमान्य किया जा सकता है. साथ ही, यह अमान्य होने की जानकारी, अन्य प्रोसेस में मौजूद AppDatabase के इंस्टेंस में अपने-आप पहुंच जाती है.

इस्तेमाल

डेटा इकाई, डीएओ, और डेटाबेस ऑब्जेक्ट तय करने के बाद, डेटाबेस का इंस्टेंस बनाने के लिए यहां दिया गया कोड इस्तेमाल किया जा सकता है:

Kotlin

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

Java

AppDatabase db = Room.databaseBuilder(getApplicationContext(),
        AppDatabase.class, "database-name").build();

इसके बाद, डीएओ का इंस्टेंस पाने के लिए, AppDatabase से ऐब्स्ट्रैक्ट मैथड का इस्तेमाल किया जा सकता है. इसके बाद, डीएओ इंस्टेंस के तरीकों का इस्तेमाल करके, डेटाबेस से इंटरैक्ट किया जा सकता है:

Kotlin

val userDao = db.userDao()
val users: List<User> = userDao.getAll()

Java

UserDao userDao = db.userDao();
List<User> users = userDao.getAll();

अन्य संसाधन

Room के बारे में ज़्यादा जानने के लिए, यहां दिए गए अन्य संसाधन देखें:

सैंपल

कोडलैब

ब्लॉग