java - कमरा-स्कीमा निर्यात निर्देशिका एनोटेशन प्रोसेसर को प्रदान नहीं की जाती है, इसलिए हम स्कीमा को निर्यात नहीं कर सकते हैं




android database (4)

@mikejonesguy answer एकदम सही है, अगर आप कमरे के माइग्रेशन (अनुशंसित) का परीक्षण करने की योजना बनाते हैं, तो स्रोत सेट में स्कीमा स्थान जोड़ें।

अपनी build.gradle फ़ाइल में आप इन जेनरेट की गई स्कीमा JSON फ़ाइलों को रखने के लिए एक फ़ोल्डर निर्दिष्ट करते हैं। जैसे ही आप अपना स्कीमा अपडेट करते हैं, आप कई JSON फ़ाइलों के साथ समाप्त हो जाएंगे, हर संस्करण के लिए एक। सुनिश्चित करें कि आप हर जेनरेट की गई फ़ाइल को स्रोत नियंत्रण में रखें। अगली बार जब आप अपना संस्करण संख्या फिर से बढ़ाएँगे, तो कक्ष परीक्षण के लिए JSON फ़ाइल का उपयोग करने में सक्षम होगा।

  • फ्लोरिना मुंटेंस्कु ( source )

build.gradle

android {

    // [...]

    defaultConfig {

        // [...]

        javaCompileOptions {
            annotationProcessorOptions {
                arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
    }

    // add the schema location to the source sets
    // used by Room, to test migrations
    sourceSets {
        androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
    }

    // [...]
}

मैं Android डेटाबेस घटक कक्ष का उपयोग कर रहा हूं

मैंने सब कुछ कॉन्फ़िगर किया है, लेकिन जब मैं संकलन करता हूं, तो एंड्रॉइड स्टूडियो मुझे यह चेतावनी देता है:

स्कीमा निर्यात निर्देशिका एनोटेशन प्रोसेसर को प्रदान नहीं की जाती है, इसलिए हम स्कीमा को निर्यात नहीं कर सकते हैं। आप या तो room.schemaLocation एनोटेशन प्रोसेसर तर्क प्रदान कर सकते हैं या ExportSchema को गलत पर सेट कर सकते हैं।

जैसा कि मैं समझता हूं कि यह वह स्थान है जहां DB फाइल स्थित होगी

यह मेरे ऐप को कैसे प्रभावित कर सकता है? यहाँ सबसे अच्छा अभ्यास क्या है? क्या मुझे डिफ़ॉल्ट स्थान ( false मान) का उपयोग करना चाहिए?


Kotlin? ये रहा:

android {

    // ... (compileSdkVersion, buildToolsVersion, etc)

    defaultConfig {

     // ... (applicationId, miSdkVersion, etc)

        kapt {
            arguments {
                arg("room.schemaLocation", "$projectDir/schemas".toString())
            }
        }
    }

    buildTypes {
    // ... (buildTypes, compileOptions, etc)
    }
}

//...

प्लगइन के बारे में मत भूलना:

apply plugin: 'kotlin-kapt'

कोटलिन एनोटेशन प्रोसेसर के बारे में अधिक जानकारी के लिए कृपया देखें: कोटलिन डॉक्स


उपरोक्त उत्तर सही हैं। इस संस्करण का पालन करना आसान है:

क्योंकि "स्कीमा निर्यात निर्देशिका एनोटेशन प्रोसेसर को प्रदान नहीं की जाती है", इसलिए हमें स्कीमा निर्यात के लिए निर्देशिका प्रदान करने की आवश्यकता है:

चरण [१] आपकी फाइल में जो रूमडैबस को बढ़ाती है, लाइन को इसमें बदलें:

`@Database(entities = ???.class,version = 1, exportSchema = true)`

या

`@Database(entities = ???.class,version = 1)` 

(क्योंकि डिफ़ॉल्ट मान हमेशा सत्य होता है)

चरण [2] अपने बिल्ड.ग्रेडल (प्रोजेक्ट: ????) फ़ाइल में, डिफ़ॉल्ट कॉन्फिग {} (जो कि एंड्रॉइड {} बड़े सेक्शन के अंदर है) के अंदर, javaCompileOptions {} सेक्शन जोड़ें, यह इस तरह होगा:

         android{
                defaultConfig{
                      //javaComplieOptions SECTION
                      javaCompileOptions {
                            annotationProcessorOptions {
                                     arguments = ["room.schemaLocation":"$projectDir/schemas".toString()]
                            }
                       }
                      //Other SECTION
                      ...
                }
         }

$ ProjectDir : एक चर नाम है, आप इसे बदल नहीं सकते। इसे आपकी खुद की प्रोजेक्ट डायरेक्टरी मिलेगी

स्कीमा : एक स्ट्रिंग है, आप इसे अपनी पसंद के किसी भी व्यक्ति में बदल सकते हैं। उदाहरण के लिए: "$projectDir/MyOwnSchemas".toString()


docs अनुसार:

आप एक फ़ोल्डर में स्कीमा निर्यात करने के लिए कक्ष को बताने के लिए एनोटेशन प्रोसेसर तर्क (Room.schemaLocation) सेट कर सकते हैं। हालांकि यह अनिवार्य नहीं है, यह आपके कोडबेस में संस्करण इतिहास रखने के लिए एक अच्छा अभ्यास है और आपको उस फ़ाइल को अपने संस्करण नियंत्रण प्रणाली में करना चाहिए (लेकिन इसे अपने ऐप के साथ शिप न करें!)।

इसलिए यदि आपको स्कीमा की जांच करने की आवश्यकता नहीं है और आप चेतावनी से छुटकारा पाना चाहते हैं, तो निम्नानुसार exportSchema = false को अपने RoomDatabase जोड़ें।

@Database(entities = { YourEntity.class }, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
   //...
}

यदि आप नीचे दिए गए @mikejonesguy answer का अनुसरण करते हैं, तो आप डॉक्स में वर्णित अच्छे अभ्यास का अनुसरण करेंगे :)। मूल रूप से आपको .json फ़ाइल आपके ../app/schemas/ फ़ोल्डर में मिल जाएगी। और यह कुछ इस तरह दिखता है:

{
  "formatVersion": 1,
  "database": {
    "version": 1,
    "identityHash": "53db508c5248423325bd5393a1c88c03",
    "entities": [
      {
        "tableName": "sms_table",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `message` TEXT, `date` INTEGER, `client_id` INTEGER)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER"
          },
          {
            "fieldPath": "message",
            "columnName": "message",
            "affinity": "TEXT"
          },
          {
            "fieldPath": "date",
            "columnName": "date",
            "affinity": "INTEGER"
          },
          {
            "fieldPath": "clientId",
            "columnName": "client_id",
            "affinity": "INTEGER"
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [],
        "foreignKeys": []
      }
    ],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"53db508c5248423325bd5393a1c88c03\")"
    ]
  }
}

अगर मेरी समझ सही है, तो आपको हर डेटाबेस वर्जन अपडेट के साथ ऐसी फाइल मिल जाएगी, ताकि आप अपने db के इतिहास का आसानी से पालन कर सकें।





android-room