Room - Thư mục xuất lược đồ không được cung cấp cho bộ xử lý chú thích nên chúng tôi không thể xuất lược đồ

382
Misha Akopov 2017-06-02 20:25.

Tôi đang sử dụng Phòng thành phần cơ sở dữ liệu Android

Tôi đã định cấu hình mọi thứ, nhưng khi tôi biên dịch, Android Studio đưa ra cảnh báo sau:

Thư mục xuất lược đồ không được cung cấp cho bộ xử lý chú thích nên chúng tôi không thể xuất lược đồ. Bạn có thể cung cấp room.schemaLocationđối số trình xử lý chú thích HOẶC đặt exportSchema thành false.

Theo tôi hiểu, đó là vị trí mà tệp DB sẽ được đặt

Nó có thể ảnh hưởng đến ứng dụng của tôi như thế nào? Thực hành tốt nhất ở đây là gì? Tôi có nên sử dụng vị trí ( falsegiá trị) mặc định không?

7 answers

440
DoruChidean 2017-06-20 20:58.

Theo tài liệu :

Bạn có thể đặt đối số của bộ xử lý chú thích (room.schemaLocation) để yêu cầu Room xuất lược đồ vào một thư mục. Mặc dù nó không phải là bắt buộc, nhưng bạn nên có lịch sử phiên bản trong codebase của mình và bạn nên chuyển tệp đó vào hệ thống kiểm soát phiên bản của mình (nhưng đừng gửi nó cùng với ứng dụng của bạn!).

Vì vậy, nếu bạn không cần kiểm tra lược đồ và bạn muốn loại bỏ cảnh báo, chỉ cần thêm exportSchema = falsevào của bạn RoomDatabase, như sau.

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

Nếu bạn theo dõi câu trả lời của @mikejonesguy bên dưới, bạn sẽ làm theo cách thực hành tốt được đề cập trong tài liệu :). Về cơ bản, bạn sẽ nhận được một .jsontệp trong ../app/schemas/thư mục của mình . Và nó trông giống như sau:

{
  "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\")"
    ]
  }
}

Nếu sự hiểu biết của tôi là đúng, bạn sẽ nhận được một tệp như vậy với mỗi lần cập nhật phiên bản cơ sở dữ liệu, để bạn có thể dễ dàng theo dõi lịch sử của db của mình.

418
mikejonesguy 2017-06-08 14:44.

Trong build.gradletệp cho mô-đun ứng dụng của bạn, hãy thêm phần này vào defaultConfigphần (dưới androidphần). Thao tác này sẽ ghi lược đồ ra một schemasthư mục con của thư mục dự án của bạn.

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

Như thế này:

// ...

android {

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

    defaultConfig {

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

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

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

}

// ...
211
Ivanov Maksim 2018-02-08 12:23.

Kotlin? Chúng ta bắt đầu:

android {

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

    defaultConfig {

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

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

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

//...

Đừng quên về plugin:

apply plugin: 'kotlin-kapt'

Để biết thêm thông tin về bộ xử lý chú thích kotlin, vui lòng truy cập: Kotlin docs

14
LunaRivolxoxo 2019-01-26 04:12.

Câu trả lời trên là chính xác. Phiên bản này rất dễ làm theo:

Vì "Thư mục xuất lược đồ không được cung cấp cho bộ xử lý chú thích", Vì vậy, chúng tôi cần cung cấp thư mục để xuất lược đồ:

Bước [1] Trong tệp mở rộng RoomDatabase của bạn, hãy thay đổi dòng thành:

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

Hoặc là

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

(vì giá trị mặc định luôn đúng)

Bước [2] Trong tệp build.gradle (project: ????) của bạn, bên trong defaultConfig {} (nằm bên trong android {} big section), thêm phần javaCompileOptions {} , nó sẽ giống như sau:

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

$ projectDir : là một tên biến, bạn không thể thay đổi nó. nó sẽ nhận được thư mục dự án của riêng bạn

schemas : là một chuỗi, bạn có thể thay đổi nó thành bất kỳ thứ gì bạn muốn. Ví dụ: "$projectDir/MyOwnSchemas".toString()

10
chebaby 2018-11-02 23:45.

Câu trả lời @mikejonesguy là hoàn hảo, chỉ trong trường hợp bạn định kiểm tra việc di chuyển phòng (được khuyến nghị), hãy thêm vị trí lược đồ vào bộ nguồn.

Trong tệp build.gradle của bạn, bạn chỉ định một thư mục để đặt các tệp JSON lược đồ được tạo này. Khi cập nhật giản đồ của mình, bạn sẽ có một số tệp JSON, một tệp cho mọi phiên bản. Đảm bảo rằng bạn cam kết mọi tệp được tạo với quyền kiểm soát nguồn. Vào lần tiếp theo bạn tăng số phiên bản của mình một lần nữa, Room sẽ có thể sử dụng tệp JSON để thử nghiệm.

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
jsa 2019-09-13 22:43.

Tôi sử dụng .ktstệp Gradle (Kotlin Gradle DSL) và kotlin-kaptplugin nhưng tôi vẫn gặp lỗi biên dịch tập lệnh khi sử dụng câu trả lời của Ivanov Maksim.

Unresolved reference: kapt

Đối với tôi đây là thứ duy nhất hoạt động:

android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = mapOf("room.schemaLocation" to "$projectDir/schemas")
            }
        }
    }
}
0
Max Zonov 2019-09-26 23:27.

Có thể bạn đã không thêm lớp học trong phòng của mình vào lớp trẻ RoomDatabaseem trong@Database(entities = {your_classes})

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

DRM của Ubisoft Denies Assassin's Creed Origins đang tấn công CPU của bạn

DRM của Ubisoft Denies Assassin's Creed Origins đang tấn công CPU của bạn

Kể từ khi phát hành Assassin's Creed Origins trên PC, một số người dùng đã phàn nàn rằng việc sử dụng CPU của trò chơi là rất lớn, đôi khi tăng đến 90-100%. Điều đó không bình thường, và dẫn đến cáo buộc rằng DRM mới của trò chơi là thủ phạm.

Hãy hỏi Tiến sĩ NerdLove: Tôi lo lắng bạn gái của tôi sẽ tự sát nếu chúng tôi chia tay

Hãy hỏi Tiến sĩ NerdLove: Tôi lo lắng bạn gái của tôi sẽ tự sát nếu chúng tôi chia tay

Xin chào, tất cả các bạn Những con thú tình dục trên Internet. Chào mừng bạn đến với Ask Dr.

Những hình dán này cho bạn biết nếu con bạn bị sốt để bạn không phải đánh thức chúng

Những hình dán này cho bạn biết nếu con bạn bị sốt để bạn không phải đánh thức chúng

Ảnh: Fever-Bugz Đã có vài lần tôi và chồng nhìn chằm chằm vào đứa con gái bốn tuổi của mình khi nó đang ngủ, đưa tay sờ lên trán nó một cách bối rối. “Cô ấy có cảm thấy nóng không? Tôi nghĩ cô ấy cảm thấy nóng.

Đây có phải là sự khởi đầu cho sự kết thúc của việc giam giữ Brittney Griner?

Đây có phải là sự khởi đầu cho sự kết thúc của việc giam giữ Brittney Griner?

Brittney Griner (r.) Ngay từ đầu, thân phận của Brittney Griner đã là tình huống con tin Mỹ độc nhất trong lịch sử hiện đại.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Tầm nhìn đám mây phi tập trung của DFINITY Blockchain

Lưu ý của người biên tập: Bạn đang xem tài liệu lỗi thời từ blog DFINITY đang được bảo quản cho mục đích lưu trữ.

Tầm nhìn đám mây phi tập trung của DFINITY Blockchain

Bài đăng này khám phá tầm nhìn về đám mây phi tập trung của nhóm DFINITY và cách nó liên quan đến các nhà cung cấp blockchain truyền thống và đám mây hiện có như Amazon Web Services. Các minh chứng về công nghệ DFINITY được áp dụng bởi một mạng lưới quy mô lớn sẽ được thực hiện vào mùa thu năm 2017, sau đó sẽ được gây quỹ Chính cho quỹ hỗ trợ phi lợi nhuận, với mạng “đám mây mở” dự kiến ​​sẽ ra mắt vào đầu mùa hè năm 2018 .

Language