2017-06-02 77 views
52

Używam Android Database Komponent pokojuRoom - Schemat katalogu eksport nie jest dostarczany do procesora adnotacji, więc nie możemy wyeksportować schemat

mam skonfigurowany wszystko, ale kiedy mogę skompilować, Android Studio daje mi ostrzeżenie

Katalog eksportu schematu nie jest dostarczany do procesora adnotacji, więc nie możemy eksportować schematu. Możesz podać room.schemaLocation argument procesora adnotacji LUB ustawić exportSchema na false.

Jak rozumiem jest to miejsce, w którym plik DB będzie zlokalizowany

Jak to może wpłynąć na moją aplikację? Jaka jest tutaj najlepsza praktyka? powinienem użyć domyślnej lokalizacji (wartość false)?

Odpowiedz

57

docs powiedzieć

Można ustawić argumentu procesora adnotacji (room.schemaLocation) powiedzieć pokoju, aby wyeksportować schemat do folderu. Mimo że nie jest to obowiązkowe, dobrą praktyką jest posiadanie historii wersji w bazie kodu i powinieneś przekazać ten plik do swojego systemu kontroli wersji (ale nie wysyłaj go razem z aplikacją!).

Więc jeśli nie ma potrzeby, aby sprawdzić schemat i chcesz pozbyć się ostrzeżenia, po prostu dodaj exportedSchema = false do swojej RoomDatabase, jak następuje.

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

    ... 

} 

Jeśli zastosujemy @mikejonesguy answer poniżej, będzie postępować zgodnie z dobrą praktyką mowa w docs :). Zasadniczo otrzymasz plik .json w swoim katalogu ../app/schemas/. I wygląda mniej więcej tak:

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

Jeśli moje rozumienie jest poprawne, dostaniesz taki plik z każdej aktualizacji wersji bazy danych, dzięki czemu można łatwo śledzić historię swojej db.

+0

Dziękuję, to działa dla mnie. –

+0

Wystąpił ten sam błąd, ale wynikało to z dodania konstruktora do mojej jednostki.Po prostu dodaj "@Ignore" do dowolnego konstruktora, którego błędy i reklama są nowym pustym konstruktorem. – Codeversed

+0

Co to naprawdę znaczy "Nie wysyłaj ze swoją aplikacją"? Będzie on uwzględniony w pakiecie APK? –

86

W pliku build.gradle modułu aplikacji dodaj ten artykuł do sekcji defaultConfig (w sekcji android). Spowoduje to zapisanie schematu do podfolderu schemas w folderze projektu.

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

Jak to:

// ... 

android { 

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

    defaultConfig { 

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

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

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

} 

// ... 
+7

Jeśli ktoś zastanawia się, dokładnie ten podejście działa również dla Kotlin podczas używania * kapt * – DanielDiSu

10

Kotlin? Zaczynamy:

android { 

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

    defaultConfig { 

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

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

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

//... 

Nie zapomnij o plugin:

apply plugin: 'kotlin-kapt'

Aby uzyskać więcej informacji na temat Kotlin procesor adnotacji pod adresem: Kotlin docs