【问题标题】:Firebase Data retrieval in array数组中的 Firebase 数据检索
【发布时间】:2018-04-10 18:21:11
【问题描述】:

这是我的 Firebase 实时数据库结构:

如何在 List 中获取这些数据以将数据传递给 Model 类。

当我尝试通过生成如下数据并且它起作用时。

listCourse = new ArrayList<>();
listCourse.add(new CourseModel("UserID", "CourseCode", "CourseName"));
listCourse.add(new CourseModel("122345", "TMN1234","System Programming"));

我只想以这种格式从 firebase 获取数据..

【问题讨论】:

  • 非常感谢您的建议.. 但是有什么简单的方法吗?因为我已经有了我的模型类,recyclerviewadapter 一切就绪,并且与我生成的我发布的列表完美配合。我只需要从 firebase 获取这种格式的数据.. 我将非常感谢任何进一步的帮助.. @AtifAbbAsi

标签: java android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

您可以通过此方法检索列表。

  Firebase ref = new Firebase(FIREBASE_URL);

  ref.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
      Log.i("Count " ,""+snapshot.getChildrenCount());
      for (DataSnapshot postSnapshot: snapshot.getChildren()) {
        CourseModel course = postSnapshot.getValue(CourseModel.class);

      }
  }
  @Override
  public void onCancelled(FirebaseError firebaseError) {
      Log.e("The read failed: " ,firebaseError.getMessage());
  }

});

请参考此文档:https://firebase.google.com/docs/database/android/lists-of-data

【讨论】:

  • 我以前尝试过这种方式,但它在空对象引用上显示“int java.util.List.size()”。当我尝试将它添加到 List listCourse 时。 .
  • 你能显示空对象引用的代码吗?您是否已正确初始化?或者试试这个:list.add(course)
  • 嘿! @Jay 抱歉,我显然没有将 recyclerview 放在正确的位置。它现在工作...感谢您的回复...
【解决方案2】:
if (dataSnapshot.exists()) {

                int i = 1;
                for (DataSnapshot dataSnapshot1 : dataSnapshot.child(userID).child("Course").getChildren()) {

                    coursecode[i]= dataSnapshot1.getKey();
                    coursename[i]=dataSnapshot.child(userID).child("Course").child(coursecode[i]).child("CourseName").getValue(String.class);
                    listCourse.add(new CourseModel(userID,coursecode[i],coursename[i]));

                    i++;

                    }

                }

我想通了..这对我有用..

【讨论】:

    【解决方案3】:

    要访问孩子,您可以创建参考。!

     DatabaseReference userRef= FirebaseDatabase.getInstance().getReference("users");
        DatabaseReference userChildRef= userRef.child(childId);
        DatabaseReference userCourseRef= userChildRef.child("courses");
        DatabaseReference userCourseIdRef= userCourseRef.child(courseId);
    
    userCourseIdRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.i(TAG, dataSnapshot.getValue(String.class);
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.w(TAG, "onCancelled", databaseError.toException());
        }
    });
    

    【讨论】:

    • ya.. 我之前尝试过的那个,但我需要同一个 List 数组中的子节点和父节点,所以我的那个对我来说工作得更好.. 而不是创建对象并将其传递给数组对象..无论如何,非常感谢您的建议..
    • 获取该列表并将其与您的模型合并
    【解决方案4】:

    要解决这个问题,有办法。首先是将数据作为CourseModel 类的对象获取,如下所示:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference coursesRef = rootRef.child("Users").child(uid).child("Courses");
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            List<CourseModel> list = new ArrayList<>();
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                CourseModel courseModel = ds.getValue(CourseModel.class);
                list.add(courseModel);
            }
            //Do what you need to do with the list of CourseModel objects
            Log.d("TAG", list.ToString);
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    coursesRef.addListenerForSingleValueEvent(valueEventListener);
    

    第二个,将courseName 作为String 像这样:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference coursesRef = rootRef.child("Users").child(uid).child("Courses");
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            List<String> list = new ArrayList<>();
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String courseName = ds.child("CourseName").getValue(String.class);
                list.add(courseName);
            }
            //Do what you need to do with the list of strings
            Log.d("TAG", list.ToString);
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    coursesRef.addListenerForSingleValueEvent(valueEventListener);
    

    【讨论】:

      猜你喜欢
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      相关资源
      最近更新 更多