2017-05-21 2 views
0

Dieser Code stürzt beim Start ab;Firebase android Fehler "Konnte Wert des Typs nicht konvertieren"

E/Android Runtime: fatal EXCEPTION: main Prozess: com.example.manya.eventspage, PID: 2974 com.google.firebase.database.DatabaseException: Fehlgeschlagen Wert vom Typ java.util.HashMap konvertiert String bei com.google.android.gms.internal.zzamy.zzcg (Unbekannte Quelle) bei com.google.android.gms.internal.zzamy.zzb (Unbekannte Quelle) bei com.google.android.gms. internal.zzamy.zza (Unbekannte Quelle) bei com.google.firebase.database.DataSnapshot.getValue (Unbekannte Quelle) bei com.example.manya.eventspage.Events $ 1.onDataChange (Events.java:46) unter com.google.android.gms.internal.zzajp.zza (Unbekannte Quelle) unter com.google.android.gms.internal.zzakp.zzcxi (Unbekannte Quelle) unter com.google.android.gms.internal.zzaks $ 1.run (Unbekannte Quelle) bei android.os.Handler.handleCallback (Handler.java:751) bei android.os.Handler.dispatchMessage (Handler.java:95) bei android.os.Looper.loop (Looper .java: 154) bei android.app.ActivityThread.main (ActivityThread.java:6077) bei java.lang.reflect.Method.invoke (native Methode) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller. run (ZygoteInit.java:865) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:755)

der Code

package com.example.manya.eventspage; 
import android.app.DatePickerDialog; 
import android.app.TimePickerDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import java.text.*; 
import java.text.DateFormat; 
import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.List; 

import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.*; 

import com.google.firebase.database.DataSnapshot; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 
import com.google.firebase.database.ValueEventListener; 

public class Events extends AppCompatActivity { 
private TextView t; 
private static ListView l; 
private static ArrayAdapter<String> adapter; 
final static ArrayList<String> arrayList = new ArrayList<String>(); 
FirebaseDatabase database=FirebaseDatabase.getInstance(); 
protected DatabaseReference myRef; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_events); 
    t = (TextView) findViewById(R.id.textView3); 
    l = (ListView) findViewById(R.id.list_view); 

    myRef=database.getReference().child("events"); 

    myRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      String val=dataSnapshot.child("events").getValue(String.class); 
      arrayList.add(val); 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    // Adapter: You need three parameters 'the context, id of the layout (it will be where the data is shown), 
    // and the array that contains the data 
    adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, arrayList); 
    l.setAdapter(adapter); 
} 
protected void onResume() 
{ 
    super.onResume(); 
    Intent in=getIntent(); 
    if(in.hasExtra(Intent.EXTRA_TEXT)) 
    { 


     String d=in.getStringExtra(Intent.EXTRA_TEXT); 
     final DatabaseReference postsRef = database.getReference().child("events"); 

     DatabaseReference newPostRef = postsRef.push(); 
     newPostRef.setValue(new event(d)); 

     arrayList.add(d); 

     // next thing you have to do is check if your adapter has changed 
     adapter.notifyDataSetChanged(); 

    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu, menu); 
    return true; 
} 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 

    if (id == R.id.add_event) { 
     Context context=Events.this; 
     Class destclass=addevent.class; 
     Intent str=new Intent(context,destclass); 
     startActivity(str); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

Die json Daten

{ 
    "events" : { 
    "events" : { 
     "-KkfUKAYAriWN7NYqTcx" : { 
     "event_detail" : "21 05 2017, 20:20TextView" 
     } 
    } 
    } 
} 
+0

Bitte bearbeiten Sie Ihre Frage, um ein minimales repräsentatives Snippet Ihrer JSON-Datenstruktur einzubinden (bitte als Text, kein Screenshot). Sie können dies erreichen, indem Sie in Ihrer [Firebase-Datenbankkonsole] (https://console.firebase.google.com/project/_/database/data) auf den Link "JSON exportieren" klicken. –

+0

Hier gelöst: https://stackoverflow.com/questions/39552348/firebase-databaseexception-failed-to-convert-value-of-type-java-lang-long-to-st/45557421#45557421 –

Antwort

1

Ihr Code Pflege der Tatsache außer Acht lässt, dass Sie eine Liste der Ereignisse unter /events/events haben. Um damit umzugehen richtig haben Sie zwei Möglichkeiten:

  1. Verwenden Sie eine ValueEventListener und Schleife über die untergeordneten Knoten
  2. Verwenden Sie ein ChildEventListener

Die erste am nächsten zu Ihrem aktuellen Code und fügt nur eine zusätzliche Schleife :

myRef=database.getReference().child("events/events"); // note the change in path 

myRef.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { 
      String val=childSnapshot.getValue(String.class); 
      arrayList.add(val); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     throw databaseError.toException(); // don't ignore errors 
    } 
}); 

Der zweite Ansatz sagt Firebase die Liste in seinem SDK zu handhaben und Oberflächen jedes Kind:

myRef=database.getReference().child("events/events"); // note the change in path 

myRef.addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String previousChildKey) { 
     String val=dataSnapshot.getValue(String.class); 
     arrayList.add(val); 
    } 

    ... 
}); 
Verwandte Themen