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

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

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

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

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

सेटअप

अपने ऐप्लिकेशन में रूम का इस्तेमाल करने के लिए, अपने ऐप्लिकेशन के build.gradle फ़ाइल:

ग्रूवी

dependencies {
    def room_version = "2.6.1"

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

    // To use Kotlin annotation processing tool (kapt)
    kapt "androidx.room:room-compiler:$room_version"
    // To use Kotlin Symbol Processing (KSP)
    ksp "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"
}

Kotlin

dependencies {
    val room_version = "2.6.1"

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

    // To use Kotlin annotation processing tool (kapt)
    kapt("androidx.room:room-compiler:$room_version")
    // To use Kotlin Symbol Processing (KSP)
    ksp("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")
}

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

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

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

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

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

सैंपल लागू करना

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

डेटा इकाई

यह कोड, 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;
}

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

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

यह कोड, UserDao नाम के डीएओ के बारे में बताता है. 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);
}

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

डेटाबेस

यह कोड, डेटाबेस को होल्ड करने के लिए 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();

अन्य संसाधन

रूम के बारे में ज़्यादा जानने के लिए, नीचे दिए गए अतिरिक्त संसाधन देखें:

सैंपल

कोड लैब

ब्लॉग