2016-06-14 2 views
0

Я пытаюсь использовать функцию setValue для отправки объекта User, который я определил в базу данных Firebase, но безуспешно. Даже пример документации, показанный here, не работает для меня. Я получаю эту ошибкуFirebase setValue не работает, «Не удалось проанализировать моментальный снимок»

Не удалось разобрать на снимок

Мой код:

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)  

Любая идея, почему это произойдет очень сильно. Благодарю.

+2

Сделайте класс, который хотите сохранить, 'Пользователь', автономный класс, а не подкласс вашей деятельности. –

+0

@qbix спасибо вам, дорогой сэр, что сработало. Я полный новичок. не могли бы вы уточнить, для чего это важно? –

+0

Ваш класс 'User' наследует десятки свойств из' AppCompatActivity'. Многие из этих свойств не соответствуют требованиям Firebase для того, что он может сериализовать/десериализовать. –

ответ

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); 
} 

давайте посмотрим, что произойдет.

+0

Это не является причиной ошибки. Кроме того, нет функциональной разницы между первым и вторым фрагментами кода, они ведут себя точно так же. – jonnydee

+0

@jonnydee, вам не кажется, что * объект alanRef * будет иметь свой экземпляр как дочерний элемент * ref * без указателя на базовый url базы данных? – Franklyn

+0

Firebase refs неизменяемы, alanRef будет по-прежнему указывать на корень базы данных. Вы должны всегда использовать возвращаемое значение для ребенка. – jonnydee

1

В ответ на мой комментарий вы запросили более подробную информацию. Я не авторитет в этом вопросе, но я расскажу то, что я узнал, от чтения the documentation и просмотра тем здесь на SO.

Столбец, который вы опубликовали, показывает, что вы используете более старую версию Firebase, которая использует Jackson library для сериализации данных. Текущая версия, 9.0.2, не использует Джексона, и есть различия в том, что поддерживается. Если вы продолжите использовать более старую версию, вы должны посмотреть на это SO question/answer для подробного объяснения.

И Джексон, и текущая реализация используют introspection/reflection для сериализации/десериализации POJO. Обработка ожидает, что POJO будет следовать определенным соглашениям относительно структуры и наименования. Документация немного тонкая в этой области. Вы часто найдете ответы на вопросы, не описанные в документации, если посмотреть на связанные вопросы SO. Некоторые примеры: inheritance, getter methods, enums. Моя рекомендация: держать просто и следовать проверенным примерам.

Хотя я не знаю конкретно, что вызвало неудачу, которую вы испытали, легко представить, что обработка интроспекции Джексона была перегружена, анализируя ваш класс User и все его суперклассы, начиная с AppCompatActivity.

0

Первый. Вы используете устаревшую документацию. Даже так говорит, если вы перейдете к top of the link you provided.

вы просматриваете унаследованных DOCS


Вопрос вот эта линия, тем не менее.

public class User extends AppCompatActivity { 

Возможно, вы ожидаете, что Пользователь станет активным, которого, к сожалению, нет.

Создайте отдельный файл User.java с содержимым вашего пользовательского класса.

Вы также можете увидеть, что в приведенной ниже ссылке ссылки.

public class User { 

Это неактивное состояние.

Удалите все остальное, кроме onCreate, и следуйте соглашениям об именовании Android в классе активности.

Смежные вопросы