कक्ष करता नहीं कम से कम जब तक नहीं एक अच्छा प्रवासन प्रणाली है, 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`))")
}
}
SQL स्क्रिप्ट से ऊपर जाने के लिए , आपके पास 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())
}
}
जब आप प्रोजेक्ट चलाते हैं या बनाते हैं तो आपको एक JSON फाइल मिलेगी 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विधि।
3. AppDatabase_Impl से क्वेरी प्राप्त करें
यदि आप स्कीमा निर्यात नहीं करना चाहते हैं तो आप प्रोजेक्ट को चलाकर या निर्माण करके क्वेरी प्राप्त कर सकते हैं जो AppDatabase_Impl.javaफ़ाइल उत्पन्न करेगा । और आपके पास निर्दिष्ट फ़ाइल में हो सकता है।
@Override
public void createAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))");
createAllTablesविधि के भीतर , सभी संस्थाओं की बनाएँ स्क्रिप्ट होगी। आप इसे प्राप्त कर सकते हैं और आपके भीतर migrateविधि में शामिल कर सकते हैं ।
4. एनोटेशन प्रोसेसिंग।
जैसा कि आप अनुमान लगा सकते हैं, कक्ष उपर्युक्त सभी को उत्पन्न करता है schema, और AppDatabase_Implसंकलन समय के भीतर और एनोटेशन प्रोसेसिंग के साथ फाइलें जो आप के साथ जोड़ते हैं
kapt "androidx.room:room-compiler:$room_version"
इसका मतलब है कि आप भी ऐसा ही कर सकते हैं और अपनी खुद की एनोटेशन प्रोसेसिंग लाइब्रेरी बना सकते हैं जो आपके लिए सभी आवश्यक प्रश्न तैयार करती है।
यह विचार करना है कि कमरे के एनोटेशन @Entityऔर के लिए एनोटेशन प्रोसेसिंग लाइब्रेरी बनाना है @Database। @Entityउदाहरण के लिए एनोटेट किया गया एक वर्ग लें । ये वो स्टेप्स हैं जिनका आपको पालन करना होगा
- एक नया
StringBuilderऔर अपीयर बनाएं "यदि आवश्यक नहीं है तो बनाएँ"
- तालिका का नाम या तो फ़ील्ड से
class.simplenameया उसके आधार पर tableNameप्राप्त करें @Entity। इसे अपने में जोड़ेंStringBuilder
- फिर अपनी कक्षा के प्रत्येक क्षेत्र के लिए SQL के कॉलम बनाएं। नाम, प्रकार, क्षेत्र की अशक्तता या तो क्षेत्र द्वारा या
@ColumnInfoएनोटेशन द्वारा लें । हर क्षेत्र के लिए, आपको 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)
}
}
मैंने अपने लिए ऐसी लाइब्रेरी बनाई जिसे आप देख सकते हैं, और यहां तक कि अपने प्रोजेक्ट में भी इसका इस्तेमाल कर सकते हैं। ध्यान दें कि मैंने जो पुस्तकालय बनाया है वह पूर्ण नहीं है और यह सिर्फ टेबल निर्माण के लिए मेरी आवश्यकताओं को पूरा करता है।
बेहतर प्रवासन के लिए RoomExtension
अनुप्रयोग जो RoomExtension का उपयोग करता है
आशा है कि यह उपयोगी था।
अपडेट करें
इस उत्तर को लिखने के समय तक, कमरा संस्करण था 2.1.0-alpha03और जब मैंने डेवलपर्स को ईमेल किया तो मुझे प्रतिक्रिया मिली
इसमें बेहतर माइग्रेशन सिस्टम होने की उम्मीद है 2.2.0
दुर्भाग्य से, हमारे पास अभी भी बेहतर प्रवासन प्रणाली का अभाव है।