Firebase setValue无效,“无法解析为快照”

时间:2016-06-14 22:02:50

标签: android firebase firebase-realtime-database

我正在尝试使用setValue函数将我定义的User对象发送到Firebase数据库,但没有成功。即使显示的文档示例here也不适用于我。我收到此错误

  

无法解析到快照

我的代码:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.firebase.client.Firebase;

public class User extends AppCompatActivity {
    private int birthYear;
    private String fullName;

    public User() {

    }

    public User(String fullName, int birthYear) {
        this.fullName = fullName;
        this.birthYear = birthYear;
    }

    public long getBirthYear() {
        return birthYear;
    }

    public String getFullName() {
        return fullName;
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user);

        Firebase.setAndroidContext(this);
        Firebase ref = new Firebase("https://mybabysit.firebaseio.com/");
        Firebase alanRef = ref.child("users").child("alanisawesome");
        User alan = new User("Alan Turing", 1912);
        alanRef.setValue(alan);
    }
}

我收到以下错误:

AndroidRuntime: FATAL EXCEPTION: main
   Process: com.example.lerun.crazybugs, PID: 4243
   java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.lerun.crazybugs/com.example.lerun.crazybugs.User}: com.firebase.client.FirebaseException: Failed to parse to snapshot
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
       at android.app.ActivityThread.-wrap11(ActivityThread.java)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:148)
       at android.app.ActivityThread.main(ActivityThread.java:5417)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    Caused by: com.firebase.client.FirebaseException: Failed to parse to snapshot
       at com.firebase.client.Firebase.setValueInternal(Firebase.java:357)
       at com.firebase.client.Firebase.setValue(Firebase.java:248)
       at com.example.lerun.crazybugs.User.onCreate(User.java:38)
       at android.app.Activity.performCreate(Activity.java:6237)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
       at android.app.ActivityThread.-wrap11(ActivityThread.java) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
       at android.os.Handler.dispatchMessage(Handler.java:102) 
       at android.os.Looper.loop(Looper.java:148) 
       at android.app.ActivityThread.main(ActivityThread.java:5417) 
       at java.lang.reflect.Method.invoke(Native Method) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    Caused by: java.lang.IllegalArgumentException: Conflicting getter definitions for property "changingConfigurations": android.app.Activity#isChangingConfigurations(0 params) vs android.app.Activity#getChangingConfigurations(0 params)
       at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:2615)
       at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:2542)
       at com.firebase.client.Firebase.setValueInternal(Firebase.java:346)
       at com.firebase.client.Firebase.setValue(Firebase.java:248) 
       at com.example.lerun.crazybugs.User.onCreate(User.java:38) 
       at android.app.Activity.performCreate(Activity.java:6237) 
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
       at android.app.ActivityThread.-wrap11(ActivityThread.java) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
       at android.os.Handler.dispatchMessage(Handler.java:102) 
       at android.os.Looper.loop(Looper.java:148) 
       at android.app.ActivityThread.main(ActivityThread.java:5417) 
       at java.lang.reflect.Method.invoke(Native Method) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    Caused by: com.fasterxml.jackson.databind.JsonMappingException: Conflicting getter definitions for property "changingConfigurations": android.app.Activity#isChangingConfigurations(0 params) vs android.app.Activity#getChangingConfigurations(0 params)
       at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:838)
       at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:387)
       at com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:478)
       at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:97)
       at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:2593)
       at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:2542) 
       at com.firebase.client.Firebase.setValueInternal(Firebase.java:346) 
       at com.firebase.client.Firebase.setValue(Firebase.java:248) 
       at com.example.lerun.crazybugs.User.onCreate(User.java:38) 
       at android.app.Activity.performCreate(Activity.java:6237) 
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
       at android.app.ActivityThread.-wrap11(ActivityThread.java) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
       at android.os.Handler.dispatchMessage(Handler.java:102) 
       at android.os.Looper.loop(Looper.java:148) 
       at android.app.ActivityThread.main(ActivityThread.java:5417) 
       at java.lang.reflect.Method.invoke(Native Method) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    Caused by: java.lang.IllegalArgumentException: Conflicting getter definitions for property "changingConfigurations": android.app.Activity#isChangingConfigurations(0 params) vs android.app.Activity#getChangingConfigurations(0 params)
       at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.getGetter(POJOPropertyBuilder.java:190)
       at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.getAccessor(POJOPropertyBuilder.java:283)
       at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.removeIgnorableTypes(BeanSerializerFactory.java:678)
       at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.findBeanProperties(BeanSerializerFactory.java:557)
       at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.constructBeanSerializer(BeanSerializerFactory.java:373)
       at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.findBeanSerializer(BeanSerializerFactory.java:268)
       at com.fasterxml.jackson.databind.ser.BeanSerializerFactory._createSerializer2(BeanSerializerFactory.java:213)
       at com.fasterxml.jackson.databind.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:152)
       at com.fasterxml.jackson.databind.SerializerProvider._createUntypedSerializer(SerializerProvider.java:873)
       at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:833)
       at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:387) 
       at com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:478) 
       at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:97) 
       at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:2593) 
       at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:2542) 
       at com.firebase.client.Firebase.setValueInternal(Firebase.java:346) 
       at com.firebase.client.Firebase.setValue(Firebase.java:248) 
       at com.example.lerun.crazybugs.User.onCreate(User.java:38) 
       at android.app.Activity.performCreate(Activity.java:6237) 
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
       at android.app.ActivityThread.-wrap11(ActivityThread.java) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
       at android.os.Handler.dispatchMessage(Handler.java:102) 
       at android.os.Looper.loop(Looper.java:148) 
       at android.app.ActivityThread.main(ActivityThread.java:5417) 
       at java.lang.reflect.Method.invoke(Native Method) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

任何关于为什么会发生这种情况的想法都会受到很大的影响。感谢。

3 个答案:

答案 0 :(得分:1)

在您对我的评论的回复中,您要求提供更多详细信息。我不是这方面的权威,但我会分享我从阅读the documentation中学到的知识,并在此处浏览主题。

您发布的堆栈跟踪显示您使用的是旧版Firebase,它使用Jackson library来序列化数据。当前版本9.0.2不使用Jackson,并且支持的内容存在差异。如果您继续使用旧版本,则应查看此SO question/answer以获取详细说明。

Jackson和当前的实现都使用introspection/reflection来序列化/反序列化POJO。处理期望POJO遵循关于结构和命名的某些约定。该领域的文档有点薄。您将经常通过查看相关的SO问题找到文档中未涉及的问题的答案。一些示例:inheritancegetter methodsenums。我的建议是:保持简单并遵循经过验证的例子。

虽然我没有具体了解导致您失败的原因,但很容易想象杰克逊内省处理在AppCompatActivity开始时分析您的User类及其所有超类是不堪重负的。

答案 1 :(得分:0)

我认为 alanRef 与你的火力网址没有任何联系。在你的onCreate中,改变它。

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user);

    Firebase.setAndroidContext(this);
    Firebase ref = new Firebase("https://mybabysit.firebaseio.com/");
    Firebase alanRef = ref.child("users").child("alanisawesome");
    User alan = new User("Alan Turing", 1912);
    alanRef.setValue(alan);
 }

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user);

    Firebase.setAndroidContext(this);

    Firebase alanRef = new Firebase("https://mybabysit.firebaseio.com/");
    alanRef.child("users").child("alanisawesome");
    User alan = new User("Alan Turing", 1912);
    alanRef.setValue(alan);
 }

让我们看看会发生什么。

答案 2 :(得分:0)

<强>第一即可。您使用的是过时的文档。即便如此,如果你滚动到top of the link you provided

  

你正在查看遗产文件

这里的问题是这一行。

public class User extends AppCompatActivity {

您似乎期望用户成为一个活动,但遗憾的是,它不是。

使用您的用户类内容创建单独的User.java文件。

您还可以在您提供的示例链接中看到。

public class User {

这不会扩展任何活动。

删除除onCreate之外的所有其他内容,并遵循活动类中的Android命名约定。

public class UserActivity extends AppCompatActivity {