首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Firestore:为名称isText找到冲突的getter

Firestore:为名称isText找到冲突的getter
EN

Stack Overflow用户
提问于 2018-03-15 20:34:38
回答 2查看 592关注 0票数 0

我试着看类似的问题,但对我来说没有用。

我有一堂课:

代码语言:javascript
复制
data class TextMessage(val text: String,
                   override val time: Date,
                   override val senderId: String,
                   override val isText: Boolean = true)
: Message{
constructor() : this("", Date(0), "") }

然后,我尝试将它的一个实例存储在Firestore中:

代码语言:javascript
复制
fun sendTextMessage(message: TextMessage, channelId: String) {
    chatChannelsCollectionRef.document(channelId)
            .collection("messages")
            .add(message)
}

由于某种原因,每当我调用sendTextMessage时,我都会得到这样的异常:

代码语言:javascript
复制
java.lang.RuntimeException: Found conflicting getters for name isText on class com.resocoder.firemessageprep.model.TextMessage
at com.google.android.gms.internal.zzevb$zza.<init>(Unknown Source:191)
at com.google.android.gms.internal.zzevb.zzg(Unknown Source:12)
at com.google.android.gms.internal.zzevb.zza(Unknown Source:285)
at com.google.android.gms.internal.zzevb.zzbw(Unknown Source:2)
at com.google.firebase.firestore.zzk.zzcd(Unknown Source:36)
at com.google.firebase.firestore.CollectionReference.add(Unknown Source:5)
at com.resocoder.firemessageprep.util.FirestoreUtil.sendTextMessage(FirestoreUtil.kt:138)
at com.resocoder.firemessageprep.ChatActivity$onCreate$1$2.onClick(ChatActivity.kt:52)
at android.view.View.performClick(View.java:6256)
at android.view.View$PerformClick.run(View.java:24701)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)

                                                                               at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

这没有意义。我知道TextMessage实现了一个具有属性isText的接口,但这不应该是原因.对吗?

谢谢你读了这么多!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-15 20:47:08

代码中的问题是,您正在使用一个名为isText的字段。在Cloud中,协同响应的getter是getText(),而不是getIsText()

如果您试图更改字段的名称,比方说,izText而不是isText,并且有相应的getter (如getIzText() ),那么您的代码将运行得非常好。Firestore从getter中删除is前缀,这就是为什么会出现这种冲突。要获得更多信息,您还可以查看这个视频

如果您决定更改该字段名,请不要忘记删除旧数据并添加新数据。

票数 2
EN

Stack Overflow用户

发布于 2018-03-15 22:10:37

为TextMessage生成的类文件定义了以下方法。这是通过对其运行javap获得的:

代码语言:javascript
复制
public final java.lang.String getText();
public java.util.Date getTime();
public java.lang.String getSenderId();
public boolean isText();

Firestore之所以困惑,是因为它从类中的getter名称派生出文档属性的名称。因此,按照JavaBean的惯例,getText()变成了"text“。isText()也变成了"text“。Firestore不知道您想要为名为"text“的文档属性使用哪一个,因此产生了消息。

为了避免这种冲突,您必须更改其中一个的名称。或者,您也可以尝试使用PropertyName注释来更改Firestore对任一字段的命名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49308719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档