【问题标题】:child Reference in Firebase DatabaseFirebase 数据库中的子参考
【发布时间】:2017-10-08 18:15:06
【问题描述】:

我只想检索活动 id1 和 id2,以便将其保存在列表中。但是,我这样做了,最后一行返回整个对象引用

{Category 1={name=joy, Sprint={Activities={id2=23r90u9329r,
id1=jf92jf943jf94j3f9}, startingDate =08092017, sprintOverallScore=1,
Ending Date=08092017, Number of Weeks=2}}

我怎样才能得到Activities={id2=23r90u9329r, id1=jf92jf943jf94j3f9}

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);


        //getting the reference of artists node
        databaseCategories = FirebaseDatabase.getInstance().getReference("Categories");


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

                //clear the list
                currentCategories.clear();

                //iterate through all the node
                for(DataSnapshot postsnapshot: dataSnapshot.getChildren()){


                    //Category j = postsnapshot.getValue(Category.class);

                    System.out.println("test: " + postsnapshot.getValue());

我尝试像这样创建 2 个数据库引用,但它返回 NULL:

DatabaseReference databaseCategories, databaseCategories2;

             ....


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

                //clear the list
                currentCategories.clear();

                //iterate through all the node
                for(DataSnapshot postsnapshot: dataSnapshot.getChildren()){

                    String g = postsnapshot.getKey(); //get the id

                    databaseCategories2 = FirebaseDatabase.getInstance().getReference("CategoryNew").child(g+"").child("Category 1").child("Sprint").child("Activities");


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

                            System.out.println("test new: " + dataSnapshot.getValue()); //returning NULL

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

【问题讨论】:

  • 您在问题中包含了 JSON 树的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 your Firebase Database console 中的导出 JSON 链接轻松获得该文本。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。

标签: android firebase firebase-realtime-database


【解决方案1】:

由于您在/Categories 上附加了一个侦听器,因此您的onDataChange 将使用dataSnapshot 调用,并在其下具有完整的值。你遍历它的孩子,这会让你下降一级,但你的postSnapshot 仍然是hsdhs... 下的整个数据。您还需要在代码中导航其余的快照,以访问活动:

databaseCategories = FirebaseDatabase.getInstance().getReference("Categories");

databaseCategories.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        //iterate through the categories
        for(DataSnapshot categorySnapshot: dataSnapshot.getChildren()){
            DataSnapshot activitiesSnapshot = categorySnapshot.child("Category1/Sprint/Activities");
            for(DataSnapshot activitySnapshot: activitiesSnapshot.getChildren()){
                System.out.println(activitySnapshot.getKey()+": "+activitySnapshot.getValue(String.class));
            }
        }
    }

    ...

请注意,这非常浪费,无论是您必须编写的代码量还是检索的数据量。如果您的应用中有一个常见用例来查找某个类别的活动,请考虑将其存储为顶级列表:

CategoryActivities
  CategoryId
    ActivityId1: "value 1"
    ActivityId2: "value 2"

使用这种结构,您可以更轻松地准确读取您需要的数据,同时节省数据传输和深度嵌套代码。

【讨论】:

  • 感谢您的提示,我可能最终会这样做,因为嵌套循环确实如此。再次感谢。
  • 是的,我已经这样做了,但是由于我的声誉数较低,因此无法记录反馈,但我对您的回答感到满意,谢谢。
猜你喜欢
  • 2020-06-20
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
相关资源
最近更新 更多