ঘর - স্কোমা রফতানি ডিরেক্টরিটি টীকাগুলি প্রসেসরের কাছে সরবরাহ করা হয় না তাই আমরা স্কিমা রফতানি করতে পারি না


349

আমি অ্যান্ড্রয়েড ডেটাবেস কম্পোনেন্ট রুম ব্যবহার করছি

আমি সবকিছু কনফিগার করেছি, তবে যখন আমি সংকলন করব তখন অ্যান্ড্রয়েড স্টুডিও আমাকে এই সতর্কতা দেয়:

স্কোমা রফতানি ডিরেক্টরিটি টীকাগুলি প্রসেসরের সরবরাহ করা হয় না তাই আমরা স্কিমা রফতানি করতে পারি না। আপনি হয় room.schemaLocationএনোটেশন প্রসেসরের যুক্তি সরবরাহ করতে পারেন বা এক্সপোর্টশেমিটিকে মিথ্যা হিসাবে সেট করতে পারেন।

যেহেতু আমি বুঝতে পেরেছি এটি ডিবি ফাইলটি যেখানে অবস্থান করবে

এটি কীভাবে আমার অ্যাপ্লিকেশনটিকে প্রভাবিত করতে পারে? এখানে সেরা অনুশীলন কি? আমার কি ডিফল্ট অবস্থান ( falseমান) ব্যবহার করা উচিত ?

উত্তর:


395

অনুযায়ী ডক্স :

রুমটি কোনও ফোল্ডারে রফতানি করতে আপনার ঘরে ডেকে আনতেটেশন প্রসেসরের আর্গুমেন্ট (room.schemaLocation) সেট করতে পারেন। এটি বাধ্যতামূলক না হলেও, আপনার কোডবেজে সংস্করণ ইতিহাস থাকা ভাল অভ্যাস এবং আপনার ফাইলটি আপনার সংস্করণ নিয়ন্ত্রণ সিস্টেমে প্রতিশ্রুতি দেওয়া উচিত (তবে এটি আপনার অ্যাপ্লিকেশন দিয়ে শিপ করবেন না)।

সুতরাং যদি আপনার স্কিমাটি পরীক্ষা করার প্রয়োজন না হয় এবং আপনি সতর্কতা থেকে মুক্তি পেতে চান তবে নীচের exportSchema = falseমত আপনার সাথে যুক্ত করুন RoomDatabase

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

আপনি যদি নীচে @ মাইকেজোনসগুই উত্তরটি অনুসরণ করেন তবে আপনি ডক্সে উল্লিখিত ভাল অনুশীলনটি অনুসরণ করবেন :)। মূলত আপনি .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\")"
    ]
  }
}

যদি আমার বোঝাপড়াটি সঠিক হয়, আপনি প্রতিটি ডাটাবেস সংস্করণ আপডেটের সাথে একটি ফাইল পাবেন যাতে আপনি সহজেই আপনার ডিবি এর ইতিহাস অনুসরণ করতে পারেন।


7
"আপনার অ্যাপ্লিকেশন দিয়ে শিপ করবেন না" এর অর্থ কী? এটি APK এ অন্তর্ভুক্ত হবে?
জংজ পুয়াংপুট

2
যদি "আপনার অ্যাপ্লিকেশন দিয়ে শিপ করবেন না" অনুসরণ করেন, তবে আমি APK তৈরির আগে JSON ফাইলগুলি সরিয়ে ফেলতে পারি?
বিভ্রম

7
"আপনার অ্যাপ্লিকেশন দিয়ে শিপ করবেন না" এর অর্থ "অ্যাপ্লিকেশন / রেস / কাঁচা" পছন্দ করতে স্কিমা লোকেশন সেট করবেন না the
গ্যালসিউরিও

3
@galcyurio $ প্রোজেক্টডির / স্কিমাসগুলি APK এর বাইরে কোনও ডিরেক্টরি, তাই না? আমি উত্পন্ন APKটি অন্বেষণ করেছি এবং আমি এটি সেখানে দেখছি না। যদিও আমি উদাহরণ / উদাহরণস্বরূপ / অ্যাপ্লিকেশন / অ্যাপ্লিকেশন / src / main / res এর জন্য অ্যাকাউন্টগুলি দেখি।
xarlymg89

1
@glucaio আমি APK (এবং অ্যাপ্লিকেশন বান্ডেলটি )ও অনুসন্ধান করেছি এবং এটি খুঁজে পেলাম না। সুতরাং আমি বিশ্বাস করি আমরা নিরাপদ
xarlymg89

387

ইন build.gradleআপনার অ্যাপ মডিউলের জন্য ফাইল, এই যোগ defaultConfig(অধীনে অধ্যায় androidঅধ্যায়)। এটি schemasআপনার প্রকল্প ফোল্ডারের সাবফোল্ডারে স্কিমাটি লিখবে ।

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

এটার মত:

// ...

android {

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

    defaultConfig {

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

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

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

}

// ...

34
যদি কেউ ভাবছেন, ক্যাপট
ড্যানিয়েলডিজু

1
আমাদের যদি app/schemasএই অপারেশন দ্বারা ডিরেক্টরিটিতে উত্পন্ন জাসন ফাইলটি গিটিগনোর করা উচিত । এবং আমি শুনেছি আমাদের স্কিমাটি এমন একটি ডিরেক্টরিতে রাখা উচিত যা এর মধ্যে অন্তর্ভুক্ত নেই apk। আমরা কীভাবে এটি করতে পারি?
রবি

2
@ উত্পন্ন স্কিমা ফাইল (গুলি) সংস্করণ নিয়ন্ত্রণে সংরক্ষণ করা উচিত কারণ এটি পরিবর্তনগুলি সনাক্ত করতে এবং এটি ডেটাবেস পরিবর্তন করে আপনি ডাটাবেস সংস্করণ আপডেট করেন এবং মাইগ্রেশন পরিকল্পনা তৈরি করেন কিনা তা নিশ্চিত করতে সহায়তা করে
অ্যাপম্যাটাস ২

1
এই কনফিগারেশন রিলিজ সংস্করণে প্রভাবিত করে? মানে আমি যখন প্রকল্পটি কোনও রিলিজ অ্যাপে রফতানি করি।
আনারগু

যদি এই সমাধানটির ফলাফল ERROR এ আসে: আর্গুমেন্টগুলির জন্য পদ্ধতি এনোটেশনপ্রসেসর অধ্যায়গুলি () খুঁজে পাওয়া যায় নি , নীচে লুনার উত্তরটি দেখুন: stackoverflow.com/a/54366985/1617737
নিষিদ্ধ-জিওঞ্জিনিয়ারিং

184

Kotlin? এখানে আমরা যাচ্ছি:

android {

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

    defaultConfig {

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

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

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

//...

প্লাগইন সম্পর্কে ভুলবেন না:

apply plugin: 'kotlin-kapt'

কোটলিন এনোটেশন প্রসেসর সম্পর্কে আরও তথ্যের জন্য দয়া করে দেখুন: কোটলিন ডক্স


আপনি যেভাবে উত্তর দিয়েছেন তা পছন্দ করুন: ডি
theapache64

12

উপরের উত্তরগুলি সঠিক। এই সংস্করণটি অনুসরণ করা সহজ:

যেহেতু "স্কোমা রফতানি ডিরেক্টরিটি টিকা প্রসেসরের কাছে সরবরাহ করা হয় না", সুতরাং আমাদের স্কিমা রফতানির জন্য ডিরেক্টরি সরবরাহ করতে হবে:

পদক্ষেপ [1] আপনার ফাইলটিতে যা রুমডাটাবেসকে প্রসারিত করে, লাইনটি এতে পরিবর্তন করুন:

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

অথবা

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

(কারণ ডিফল্ট মান সর্বদা সত্য)

পদক্ষেপ [২] আপনার বিল্ড.gradle (প্রকল্প: ????) ফাইলের মধ্যে, ডিফল্ট কনফিগ inside} (যা অ্যান্ড্রয়েড}} বড় বিভাগের অভ্যন্তরে থাকে) এর ভিতরে জাভা কম্পাইলঅপশন {} বিভাগ যুক্ত করুন, এটি হবে:

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

D প্রজেক্টডির : একটি পরিবর্তনশীল নাম, আপনি এটি পরিবর্তন করতে পারবেন না। এটি আপনার নিজস্ব প্রকল্প ডিরেক্টরি পাবেন

স্কিমা : একটি স্ট্রিং, আপনি এটি আপনার পছন্দমতো পরিবর্তন করতে পারেন। উদাহরণ স্বরূপ: "$projectDir/MyOwnSchemas".toString()


পদক্ষেপে [2], আপনি কি নিশ্চিত যে এটি build.gradle(project:????)এবং না build.gradle(app:????)?
এসই

9

@ মাইকেজোনসুগুয়ের উত্তরটি সঠিক, যদি আপনি ঘর স্থানান্তর পরীক্ষা করার পরিকল্পনা করেন (প্রস্তাবিত), উত্স সেটে স্কিমা অবস্থান যুক্ত করুন।

আপনার বিল্ড.gradle ফাইলে আপনি এই উত্পন্ন স্কিমা JSON ফাইলগুলি স্থাপন করার জন্য একটি ফোল্ডার নির্দিষ্ট করেন। আপনি যখন নিজের স্কিমা আপডেট করবেন, আপনি প্রতি সংস্করণের জন্য একাধিক জেএসওএন ফাইল শেষ করবেন। আপনি উত্পন্ন নিয়ন্ত্রণে প্রতিটি উত্পন্ন ফাইল প্রতিশ্রুতিবদ্ধ তা নিশ্চিত করুন। পরের বার আপনি আবার আপনার সংস্করণ নম্বর বাড়িয়ে দেবেন, রুম পরীক্ষার জন্য JSON ফাইলটি ব্যবহার করতে সক্ষম হবে।

  • ফ্লোরিয়া মুন্তেস্কু ( উত্স )

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())
    }

    // [...]
}

3

আমি .ktsগ্রেডল ফাইলগুলি (কোটলিন গ্রেডল ডিএসএল) এবং kotlin-kaptপ্লাগইন ব্যবহার করি তবে আমি ইভানভ মাকসিমের উত্তরটি ব্যবহার করার পরে আমি একটি স্ক্রিপ্ট সংকলন ত্রুটিটি পাই।

Unresolved reference: kapt

আমার জন্য এটিই কেবল কাজ করেছিল:

android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = mapOf("room.schemaLocation" to "$projectDir/schemas")
            }
        }
    }
}

আমার পক্ষে কিছুই কাজ করছে না। আমি কোটলিন ব্যবহার করছি
nyxee

0

সম্ভবত আপনি বাচ্চাদের RoomDatabaseশিশু শ্রেণিতে নিজের ঘরের ক্লাস যুক্ত করেন নি@Database(entities = {your_classes})

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.