Realm Kotlin tidak ada dalam skema

Saya mencoba menggunakan Realm.io untuk menyimpan data di Android yang saya punya RealmClass

@RealmClass
public open class Alarm : RealmObject() {
   @Required
   public open var hourOfDay: Int? = null
   @Required
   public open var minute: Int? = null
   @Required
   public open var days: BooleanArray? = null

   public open var name: String? = null
}

dan di onCreate saya mencoba menambahkan beberapa data pengujian

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    mRealm = Realm.getInstance(activity);

    mRealm.beginTransaction()

    var a = mRealm.createObject(Alarm::class.java)
    a.hourOfDay = 12
    a.minute = 1;
    a.days = booleanArrayOf(true, true, true, true, true, false, false);
    a.name = "Test${System.currentTimeMillis()}"

    mRealm.commitTransaction()
}

tapi aku mendapat pengecualian.

> java.lang.IllegalArgumentException: Alarm is not part of the schema for this Realm

at var a = mRealm.createObject(Alarm::class.java)

saya telah menetapkan aturan dunia

-keep class io.realm.annotations.RealmModule
-keep @io.realm.annotations.RealmModule class *
-keep class io.realm.internal.Keep
-keep @io.realm.internal.Keep class *
-dontwarn javax.**
-dontwarn io.realm.**

di > proguard-rules.pro

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
productFlavors {
    realmFlavor {
        proguardFile 'proguard-rules.pro'
    }
}

tapi ini tidak membawa solusi

KESIMPULAN

sejauh ini sepertinya kita harus menulis model di Java, Realm, dan perpustakaan ORM apa pun. Contoh Kotlin yang diposting di GitHub memiliki model yang ditulis dalam Java murni


person Mariusz    schedule 05.12.2015    source sumber
comment
Anda telah menyetel proguard tetapi tidak mengaktifkannya rilis { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }   -  person Maheshwar Ligade    schedule 05.12.2015
comment
masih memberikan pengecualian   -  person Mariusz    schedule 05.12.2015
comment
Tambahkan aturan ranah di file pro-guard   -  person Maheshwar Ligade    schedule 05.12.2015
comment
saya telah melakukannya sebelumnya   -  person Mariusz    schedule 05.12.2015
comment
tambahkan satu baris -pertahankan kelas io.realm.annotations.RealmModule   -  person Maheshwar Ligade    schedule 05.12.2015
comment
realm doc sudah mengatakan untuk menambahkan baris ini, saya memposting file proguard saya   -  person Mariusz    schedule 05.12.2015
comment
Apakah Anda yakin telah mengaktifkan pemrosesan anotasi?   -  person Maheshwar Ligade    schedule 05.12.2015
comment
saya tidak dapat menemukan pemrosesan anotasi di pengaturan studio Android   -  person Mariusz    schedule 05.12.2015


Jawaban (3)


"java.lang.NoClassDefFoundError: io/realm/annotations/RealmClass"

Jika Anda mengalami kesalahan di atas, kemungkinan besar Anda harus menambahkan sesuatu seperti ini ke build.gradle Anda. Dua baris terbawah untuk kapt adalah kuncinya.

//Realm
compile 'io.realm:realm-android:0.87.1'
kapt "io.realm:realm-annotations:0.87.1"
kapt "io.realm:realm-annotations-processor:0.87.1"

Sesuai komentar di bagian bawah terbitan ini: https://github.com/realm/realm-java/issues/509

person ShadowRogue7    schedule 07.01.2016

Agar Kotlin dapat bekerja dengan pemroses anotasi Realm, Anda memerlukan pengaturan berikut di build.gradle Anda

compile "io.realm:realm-android-library:0.86.0@aar"
compile "io.realm:realm-annotations:0.86.0"
kapt "io.realm:realm-annotations-processor:0.86.0"
person Christian Melchior    schedule 07.12.2015
comment
lemparan bertahap Error:Execution failed for task ':app:compileDebugJavaWithJavac'. > java.lang.NoClassDefFoundError: io/realm/annotations/RealmClass - person Mariusz; 07.12.2015
comment
Masih perlu menggunakan kapt "io.realm:realm-annotations-processor:$realm_version" kapt "io.realm:realm-annotations:$realm_version" agar Realm berfungsi dengan Kotlin? - person lagos; 03.06.2016
comment
Tidak, kami menambahkannya secara otomatis saat Anda menggunakan plugin Realm. - person Christian Melchior; 03.06.2016

Bagi saya, saya menambahkan @RealmClass ke semua model dan memperbaikinya meskipun itu tidak diperlukan.

Saya rasa ini memaksa untuk menjalankan prosesor Realm dengan benar dengan menggunakan anotator.

Untuk memeriksa model RealmObject diproses atau tidak, keluaran konsol Gradle Anda (Anda dapat membukanya di Android Studio di panel sakelar kanan bawah) harus menampilkan log pemrosesan model berwarna merah seperti di bawah ini.

:app:compileDebugJavaWithJavac
Full recompilation is required because at least one of the classes of removed jar 'kotlin-stdlib-1.0.0.jar' requires it. Analysis took 1.572 secs.

Note: Processing class ModelSomething
Note: Processing class ModelAnotherThing
Note: Creating DefaultRealmModule
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

:app:transformClassesWithRealmTransformerForDebug
:app:transformClassesWithInstantRunVerifierForDebug
:app:transformClassesWithJavaResourcesVerifierForDebug

Garis Note: berwarna merah dan Anda dapat melihat pesan Processing class ModelSomething.

Semua model Anda harus terdaftar sebagai pesan ini.

Masalah ini dilaporkan sebagai bug yang mencurigakan: https://github.com/realm/realm-java/issues/2822

person Youngjae    schedule 16.05.2016