2017-02-26 6 views
0

Ich versuche, Daten aus meiner Echtzeitdatenbank in Firebase abzurufen, aber es stürzt mit Ausnahme cannot cast hash map to string ab. Ich habe viele Tutorials und Alternativen verfolgt, aber nichts funktioniert, weil meine Datenbank so aussieht wie unten gezeigt und meine Anwendung nicht in der Lage ist, Schlüssel und Wert zu paaren.Android-Anwendung stürzt beim Abrufen von Daten aus Firebase ab

Bitte helfen Sie mir dabei. Ich habe meinen Code und den Datenbank-Screenshot unten angehängt. Vielen Dank im Voraus.

My firebase database image

public class AlaCarte extends AppCompatActivity { 

    ListView lv; 
    String arr[]=new String[]{"Paneer Butter Masala","Chicken Butter Masala","Chicken Biriyani"}; 
    ArrayList al=new ArrayList(); 
    ArrayList food=new ArrayList(); 
    Button btn; 


    Firebase mref; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_ala_carte); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setTitle("Alacarte!!"); 

     lv=(ListView)findViewById(R.id.listView); 
     btn=(Button)findViewById(R.id.button8); 


     DatabaseReference databaseReference= FirebaseDatabase.getInstance().getReference("Food items"); 

     databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) { 
       Iterable<com.google.firebase.database.DataSnapshot> iterable=dataSnapshot.getChildren(); 
       Iterator<com.google.firebase.database.DataSnapshot> it=iterable.iterator(); 
       while (it.hasNext()) 
       { 
        com.google.firebase.database.DataSnapshot dataSnapshot1=it.next(); 
        String catnane=dataSnapshot1.getKey(); 
        Iterable<com.google.firebase.database.DataSnapshot> iterable2=dataSnapshot1.getChildren(); 
        Iterator<com.google.firebase.database.DataSnapshot> it2=iterable2.iterator(); 
        while (it2.hasNext()) 
        { 
         String proname=dataSnapshot1.getKey(); 
         String price=(String)dataSnapshot1.getValue(); 
         String item=proname+" "+price; 
         food.add(item); 
        } 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

     ArrayAdapter<String> aa=new ArrayAdapter<String>(AlaCarte.this,android.R.layout.simple_list_item_multiple_choice,food); 
     lv.setAdapter(aa); 

     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       CheckedTextView checkedTextView = ((CheckedTextView) view); 
       //checkedTextView.setChecked(!checkedTextView.isChecked()); 
       if (checkedTextView.isChecked()) { 
        checkedTextView.setChecked(false); 
        al.remove(adapterView.getItemAtPosition(i)); 
       } else { 
        checkedTextView.setChecked(true); 
        al.add(adapterView.getItemAtPosition(i)); 
       } 

      } 
     }); 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       if (al.isEmpty()) { 
        Snackbar.make(view, "Select check boxes to place your order", Snackbar.LENGTH_LONG) 
          .setAction("Action", null).show(); 
       } else { 
        Intent i = new Intent(AlaCarte.this, ConfirmAlacarte.class); 
        i.putExtra("mylist", al); 
        startActivity(i); 

       } 
      } 
     }); 
    } 

} 
+0

Können Sie Ihre Logcat-Ausgabe hinzufügen? – Mohamed

Antwort

0
String price=(String)dataSnapshot1.getValue() 

Nach dem API reference der Wert eine dieser sein könnte.

Wert gibt die in diesem Snapshot enthaltenen Daten als native Typen zurück. Die möglichen Typen zurückgegeben werden:

Bool

String

lange

Doppel

IDictionary {string, object}

Liste {object} Diese Liste ist rekursiv; Die möglichen Typen für das Objekt in der obigen Liste sind durch die gleiche Liste gegeben. Diese Typen entsprechen den in JSON verfügbaren Typen.

Überprüfen Sie, bevor Sie es umsetzen.

Object obj = dataSnapshot1.getValue(); 
If (obj instanceof String) { 
     String price=(String)dataSnapshot1.getValue() 
} 
1

Sie speichern die Preise als Nummer, versuchen aber, sie als Zeichenfolge abzurufen.

public void onDataChange(DataSnapshot foodItemsSnapshot) { 
    for (DataSnapshot categorySnapshot: foodItemsSnapshot.getChildren()) { 
    String categoryName = categorySnapshot.getKey(); 
    for (DataSnapshot foodItemSnapshot: categorySnapshot.getChildren()) { 
     String foodItemName = foodItemSnapshot.getKey(); 
     Integer price = foodItemSnapshot.getValue(Integer.class); 
     String description = foodItemName+" "+price; 
    } 
    } 
} 

Wenn dies bei einem bestimmten Element fehlschlägt, folgt es höchstwahrscheinlich nicht den Regeln für Ihre Datenstruktur. Wenn dies der Fall ist, fügen Sie den JSON des betreffenden Abschnitts der Baumstruktur in Ihre Frage ein. Es ist viel einfacher zu helfen, wenn Sie den JSON als Text anstelle eines Screenshots einfügen. Sie können diesen Text leicht erhalten, indem Sie auf den Link JSON exportieren in your Firebase Database console klicken. Da der JSON als Text durchsuchbar ist, können wir ihn einfach verwenden, um mit Ihren tatsächlichen Daten zu testen und sie in unserer Antwort zu verwenden, und im Allgemeinen ist dies nur eine gute Sache.

Verwandte Themen