【问题标题】:unable to create ArrayList inside RealmObject subclass无法在 RealmObject 子类中创建 ArrayList
【发布时间】:2017-05-17 08:31:01
【问题描述】:

我有一个类,它是 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
}

如果我删除父类一切正常

【问题讨论】:

    标签: java android realm kotlin


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        你不能。领域只接受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()
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-12
          • 2011-10-08
          • 2014-12-29
          相关资源
          最近更新 更多