从Android中的Firebase检索JSON数组

时间:2017-12-05 04:22:43

标签: android firebase firebase-realtime-database

我有一个JSON数组,我存储了一些我要在应用程序主菜单上显示的项目。它看起来像这样:

enter image description here

我想检索此列表但由于某种原因我忽略下面的代码不起作用:

DatabaseReference mRootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference mMainMenuRef = mRootRef.child("main_menu");

    @Override
protected void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);

    mMainMenuRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                String stringValue = ds.getValue(String.class);
                Log.i("Firebase", stringValue);
            }
        }

        ...

    });

2 个答案:

答案 0 :(得分:1)

您在数据库中引用了/main_menu的点:

DatabaseReference mMainMenuRef = mRootRef.child("main_menu");

然后你听这个参考并循环数据:

mMainMenuRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            String stringValue = ds.getValue(String.class);
            Log.i("Firebase", stringValue);
        }
    }

这意味着您直接在/main_menu下遍历子节点,因此-L-FDnRW...。然后,您尝试获取该节点的字符串值。但-L-FDnRW...包含整个JSON对象,因此没有单个字符串值。

要在-L-FDnRW...下获取特定媒体资源的价值,请使用DataSnapshot.child()方法:

public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot ds : dataSnapshot.getChildren()) {
        String stringValue = ds.child("0").getValue(String.class);
        Log.i("Firebase", stringValue);
    }
}

要显示所有子项的值,请遍历子快照:

public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot ds : dataSnapshot.getChildren()) {
      for (DataSnapshot prop : ds.getChildren()) {
        String stringValue = ptop.getValue(String.class);
        Log.i("Firebase", stringValue);
      }
    }
}

答案 1 :(得分:1)

根据您的要求,以下是您修改后的代码:

DatabaseReference mRootRef = 
FirebaseDatabase.getInstance().getReference();
DatabaseReference mMainMenuRef = mRootRef.child("main_menu");

@Override
protected void onStart() {
   super.onStart();
   mAuth.addAuthStateListener(mAuthListener);

   mMainMenuRef.addValueEventListener(new ValueEventListener() {
       @Override
       public void onDataChange(DataSnapshot dataSnapshot) {

          for(DataSnapshot dataSnapshot1 :dataSnapshot.getChildren())
            {

                for (DataSnapshot property :dataSnapshot1.getChildren()) {
                    String value = property.getValue(String.class);
                    Log.i("Firebase", value);
                }
            }
       }

    ...

});