2017-02-26 65 views
0

我试图从Firebase中的实时数据库中提取数据,但它崩溃时出现异常cannot cast hash map to string。我遵循了许多教程和备选方案,但没有任何工作可能是因为我的数据库如下所示,而我的应用程序无法将密钥和值配对。Android应用程序在从Firebase提取数据时崩溃

请帮我这个。我附上了我的代码和下面的数据库截图。先谢谢你。

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

你可以添加你的logcat输出吗? – Mohamed

回答

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

按照API reference,该可以是任何的这些。

Value将包含在此快照中的数据作为本机类型返回。返回的可能的类型是:

布尔

的IDictionary {字符串,对象}

列表{}对象这份名单是递归的;上述列表中对象的可能类型由相同的列表给出。这些类型对应于JSON中可用的类型。

检查之前,你施放它。

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

您将价格存储为数字,但试图将其作为字符串检索。

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

如果在特定项目上失败,它最有可能不遵循数据结构的规则。如果是这种情况,请在您的问题中包含树的特定部分的JSON。如果您将JSON作为文本而不是屏幕截图,它会更容易帮助您。点击your Firebase Database console中的导出JSON链接即可轻松获取该文本。将JSON作为文本可以搜索,使我们能够轻松使用它来测试您的实际数据,并将其用于我们的答案中,并且通常只是一件好事。