Firestore:找到名为isText的冲突getter

时间:2018-03-15 20:34:39

标签: android firebase kotlin google-cloud-firestore

我试着看一下类似的问题,但对我来说没什么用。

我有一个班级:

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中存储它的一个实例:

fun sendTextMessage(message: TextMessage, channelId: String) {
    chatChannelsCollectionRef.document(channelId)
            .collection("messages")
            .add(message)
}

出于某种原因,每当我致电sendTextMessage时,我都会遇到此异常:

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的接口,但这不应该是原因......对吗?

感谢您阅读此内容!

2 个答案:

答案 0 :(得分:2)

您的代码中的问题是您使用的是名为isText的字段。在Cloud Firestore中,相应的getter为getText()而不是getIsText()

如果您尝试更改字段的名称,比如izText而不是isText,并且拥有相应的getter,例如getIzText(),那么您的代码将完美无缺。 Firestore从getter中删除is前缀,这就是您遇到此冲突的原因。有关更多信息,您还可以查看 video

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

答案 1 :(得分:1)

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

public final java.lang.String getText();
public java.util.Date getTime();
public java.lang.String getSenderId();
public boolean isText();

Firestore SDK很困惑,因为它从类中getter的名称派生文档属性的名称。因此,通过JavaBean约定,getText()变为“text”。并且isText()也变成“文本”。 Firestore不知道您想要将哪一个用于名为“text”的文档属性,因此就是消息。

您必须更改其中一个或另一个的名称以避免此冲突。或者,您可以尝试使用PropertyName注释来更改Firestore对任一域的命名。