Firebase Android - 崩溃与"找到一个有冲突的setter名字:setGregorianChange"何时.setValue()

时间:2017-01-29 04:20:25

标签: android firebase firebase-realtime-database

我正在使用FirebaseDatabase而我无法解决非常恼人的崩溃。

每次我尝试执行: FirebaseDatabase.getInstance().getReference().child("...").push().setValue(...)

应用程序崩溃,我收到此消息:

com.google.firebase.database.DatabaseException: Found a conflicting setters with name: setGregorianChange (conflicts with setGregorianChange defined on java.util.GregorianCalendar)
at com.google.android.gms.internal.zzbqi$zza.<init>(Unknown Source)
at com.google.android.gms.internal.zzbqi.zzi(Unknown Source)
at com.google.android.gms.internal.zzbqi.zzax(Unknown Source)
at com.google.android.gms.internal.zzbqi.zzaE(Unknown Source)
at com.google.android.gms.internal.zzbqi$zza.zzaF(Unknown Source)
at com.google.android.gms.internal.zzbqi.zzax(Unknown Source)
at com.google.android.gms.internal.zzbqi.zzaw(Unknown Source)
at com.google.firebase.database.DatabaseReference.zza(Unknown Source)
at com.google.firebase.database.DatabaseReference.setValue(Unknown Source)

在我尝试保存包含FirebaseDatabase中的日历的对象后发生此崩溃。

问题是,现在,即使我从此对象中删除了日历,该应用程序也会因同样的错误而崩溃。 看起来某些东西已被破坏,我无法让它再次运作。

我已从手机中卸载该应用,清除Firebase控制台中的数据库但未解决此问题。

你们其中一个人可以帮助我吗?

-----编辑-----

我做了一些新的测试,实际上只有当我在.setValue(...)传递的类包含此方法时,应用程序才会崩溃:

public Calendar getStartTimeCalendar() {
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(startTime);
    return calendar;
}

3 个答案:

答案 0 :(得分:4)

我找到了答案(在你的帮助下Deepesh)。

我要在FirebaseDatabase中保存的类包含以下变量:

public long startTime;
public long endTime;

当我使用这种方法时应用程序崩溃(可能是因为Firebase认为他们是吸气剂):

public Calendar getStartTimeCalendar() {
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(startTime);
    return calendar;
}

public Calendar getEndTimeCalendar() {
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(endTime);
    return calendar;
}

解决方案是通过@Exclude

为这些方法添加前缀

答案 1 :(得分:0)

Firebase数据库是一个JSON数据库,这意味着它本身只能存储JSON类型。如果您尝试存储任何其他类型的信息,则必须在该类型和基础JSON类型之间进行转换,这一过程称为序列化/反序列化数据。

内置于Firebase Database SDK for Android中的Java-to-JSON序列化/反序列化可以序列化/反序列化所有支持的JSON类型可以处理由这些类型组成的简单Java对象。它不能(也不意味着)处理Android或Java SDK中大多数预先存在的类,例如java.util.GregorianCalendar

如果您想在Firebase数据库中存储日期,则必须提出自己的存储方式。对于日期,这通常归结为以下方式之一:

  1. 将日期存储为UNIX时间戳(自纪元以来的毫秒数)
  2. 将日期存储为单独的年,月和日属性
  3. 将日期存储为字符串
  4. 如何实现这些,取决于你如何获得GregorianCalendar

答案 2 :(得分:0)

即使没有可以与

对应的字段,IgnoreExtraProperties注释也不起作用