从Firebase

时间:2017-02-26 12:31:52

标签: android firebase firebase-realtime-database

我正在尝试从Firebase中的实时数据库中获取数据,但它会因异常cannot cast hash map to string而崩溃。我遵循了许多教程和替代方案,但没有任何作用可能是因为我的数据库如下所示,我的应用程序无法配对键和值。

请帮我解决这个问题。我已附上我的代码和下面的数据库截图。提前谢谢。

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

                }
            }
        });
    }

}

2 个答案:

答案 0 :(得分: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作为文本使其可搜索,允许我们轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。

答案 1 :(得分:0)

String price=(String)dataSnapshot1.getValue()

根据API reference可以是其中任何一种。

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

BOOL

的字符串

IDictionary {string,object}

List {object}此列表是递归的;上面列表中对象的可能类型由同一列表给出。这些类型对应于JSON中可用的类型。

在施放之前检查。

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