Realm Kotlin不在模式

时间:2015-12-05 10:02:23

标签: android realm kotlin

我尝试使用 Realm.io 在android中存储数据我有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
}

并在onCreate我尝试添加一些测试数据

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

但我得到例外。

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

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

我设置了领域规则

-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.**
>中的

proguard-rules.pro

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

但这没有带来解决方案

结论

到目前为止看起来我们必须在Java,Realm和任何ORM库中编写模型在GitHub上发布的Kotlin示例都有用纯Java编写的模型

3 个答案:

答案 0 :(得分:2)

“java.lang.NoClassDefFoundError:io / realm / annotations / RealmClass”

如果您遇到上述错误,您很可能必须在build.gradle中添加类似的内容。 kapt的最后两行是关键。

//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"

根据此问题底部的评论:https://github.com/realm/realm-java/issues/509

答案 1 :(得分:1)

要让Kotlin与Realm的注释处理器配合使用,您需要在build.gradle

中进行以下设置
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"

答案 2 :(得分:0)

对我来说,我已将@RealmClass添加到所有模型并修复it is not required

我认为它强制使用注释器正确运行Realm处理器。

要检查是否处理了RealmObject模型,您的Gradle控制台输出(您可以在Android Studio的右下角切换面板中打开它)必须显示红色模型处理日志,如下所示。

: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

Note:行为红色,您可以看到Processing class ModelSomething消息。

您的所有型号都应列为此消息。

此问题是以可疑错误提交的:https://github.com/realm/realm-java/issues/2822