2016-06-14 7 views
0

Ich versuche mit der setValue-Funktion ein von mir definiertes Benutzerobjekt an die Firebase-Datenbank zu senden, aber ohne Erfolg. Selbst das Dokumentationsbeispiel here funktioniert nicht für mich. Ich erhalte diesen FehlerFirebase setValue funktioniert nicht, "Fehler beim Analysieren des Snapshots"

Fehler beim Parsen

Mein Code Schnappschuss:

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

ich folgende Fehlermeldungen erhalten:

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)  

Jede Idee, warum Dies wird sehr appreciated sein. Vielen Dank.

+2

Machen Sie die Klasse, die Sie speichern möchten, 'Benutzer', eine eigenständige Klasse, keine Unterklasse Ihrer Aktivität. –

+0

@qbix danke sehr geehrter Herr, das hat funktioniert. Ich bin ein Neuling. Könnten Sie näher erläutern, warum das wichtig ist? –

+0

Ihre 'User' Klasse erbt dutzende Eigenschaften von' AppCompatActivity'. Viele dieser Eigenschaften entsprechen nicht den Anforderungen von Firebase für die Serialisierung/Deserialisierung. –

Antwort

0

Ich denke, alanRef diejenigen haben keine Verbindung mit Ihrem Feuer Basis-URL. Ändern Sie dies in Ihrem 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); 
} 

Um

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

lassen sehen, was passiert.

+0

Dies ist nicht die Ursache des Fehlers. Außerdem gibt es keinen funktionalen Unterschied zwischen dem ersten und zweiten Code-Snippet, sie verhalten sich genau gleich. – jonnydee

+0

@jonnydee, meinst du nicht, dass * alanRef * -Objekt seine Instanz als Kind von * ref * ohne einen Zeiger auf die Basis-URL der DataBase haben wird? – Franklyn

+0

Firebase Refs sind unveränderlich, alanRef wird tatsächlich immer noch auf den Stamm der Datenbank zeigen. Sie müssen immer den Rückgabewert von Kind verwenden. – jonnydee

1

In Ihrer Antwort auf meinen Kommentar haben Sie nach weiteren Details gefragt. Ich bin keine Autorität auf dem Thema, aber ich werde teilen, was ich gelernt habe von Lesen the documentation und Browsen Themen hier auf SO.

Die von Ihnen gepostete Stapelverfolgung zeigt, dass Sie eine ältere Version von Firebase verwenden, die Jackson library zum Serialisieren von Daten verwendet. Die aktuelle Version 9.0.2 verwendet nicht Jackson und es gibt Unterschiede in was unterstützt wird. Wenn Sie die ältere Version weiterhin verwenden, sollten Sie sich diese SO question/answer für eine detaillierte Erklärung ansehen.

Sowohl Jackson als auch die aktuelle Implementierung verwenden introspection/reflection zum Serialisieren/Deserialisieren eines POJO. Die Verarbeitung erwartet vom POJO bestimmte Konventionen bezüglich Struktur und Benennung. Die Dokumentation ist in diesem Bereich etwas dünn. Häufig finden Sie Antworten auf Probleme, die in der Dokumentation nicht behandelt werden, indem Sie sich verwandte SO-Fragen ansehen. Einige Beispiele: inheritance, getter methods, . Meine Empfehlung lautet: keep ist einfach und folgt bewährten Beispielen.

Obwohl ich nicht genau weiß, was den Fehler verursacht hat, den Sie erlebt haben, ist es leicht vorstellbar, dass die Jackson Introspection-Verarbeitung Ihre Benutzerklasse und alle ihre Superklassen, beginnend mit AppCompatActivity, überfordert hat.

0

Zuerst. Sie verwenden veraltete Dokumentation. Sagt sogar so, wenn Sie zum top of the link you provided blättern.

Sie sehen docs LEGACY


Das Problem hier ist diese Linie, though.

public class User extends AppCompatActivity { 

Sie scheinen zu erwarten, dass ein Benutzer eine Aktivität ist, die es leider nicht ist.

Erstellen Sie eine separate User.java Datei mit den Inhalten Ihrer Benutzerklasse.

Sie können auch sehen, dass in dem von Ihnen bereitgestellten Beispiel Link.

public class User { 

Dies verlängert keine Aktivität.

Entfernen Sie alles andere außer onCreate und folgen Sie der Android-Namenskonvention in der Aktivitätsklasse.

public class UserActivity extends AppCompatActivity { 
Verwandte Themen