无法在RealmObject子类中创建ArrayList

时间:2017-05-17 08:31:01

标签: java android realm kotlin

我有一个类是RealmObject的子类,我想在那个类中创建arraylist,它将由gson反序列化,当我开始构建项目编译时出现错误

Error:Type 'java.util.ArrayList<my_package.MessageContainerObject.Test>' of field 'messages' is not supported

这是我的班级

open class MessageContainerObject : RealmObject() {
   @SerializedName("from")
   var from = ""
   @SerializedName("messages")
   var messages = ArrayList<Test>()

   class Test
}

如果我删除父类,一切正常

3 个答案:

答案 0 :(得分:2)

您可以将消息定义为RealmList 来自文档:

  

RealmList有两种模式:托管和非托管模式。在托管模式下   所有对象都保存在Realm中,在非托管模式下它可以工作   作为普通的ArrayList。

https://realm.io/docs/java/latest/api/io/realm/RealmList.html

答案 1 :(得分:2)

ArrayList不是Realm对象支持的字段类型。您可以看到可用的类型here,也许RealmList适合您的用例?

答案 2 :(得分:0)

你做不到。领域只接受RealmList。但您可以使用RealmList并编写自定义jsonAdapter,将其转换为RealmList,反之亦然。

open class MessageContainerObject : RealmObject() {
   @SerializedName("from")
   var from = ""
   @SerializedName("messages")
   var messages = RealmList<Test>()
}
class RealmListAdapter<T : RealmModel>(
        val elementAdapter: JsonAdapter<T>) : JsonAdapter<RealmList<T>>() {

    companion object {

        val FACTORY: Factory = Factory { type, annotations, moshi ->
            val rawType: Class<*> = Types.getRawType(type)

            if (rawType == RealmList::class.java) {
                val elementType = Types.collectionElementType(type, RealmList::class.java)
                val elementAdapter = moshi.adapter<RealmModel>(elementType)
                return@Factory RealmListAdapter(elementAdapter).nullSafe()
            }
            null
        }
    }

    override fun fromJson(reader: JsonReader): RealmList<T> {

        val result = RealmList<T>()
        reader.beginArray()
        while (reader.hasNext()) {
            result.add(elementAdapter.fromJson(reader))
        }
        reader.endArray()
        return result
    }

    override fun toJson(writer: JsonWriter, value: RealmList<T>) {
        writer.beginArray()
        for (element in value) {
            elementAdapter.toJson(writer, element)
        }
        writer.endArray()
    }
}