【问题标题】:How to perform join query in firebase database using android如何使用android在firebase数据库中执行连接查询
【发布时间】:2017-09-05 07:33:15
【问题描述】:

这里成员在组中的密钥是用户的密钥。 任务:想根据 Group 的 member key 从enter code herem User 获取 comida_id。 在这里,我们首先尝试从 Group 中获取成员密钥。在获取成员密钥时,我们还希望在该成员的循环进行时获取用户和用户的 comida_id。所以场景将是首先我们将根据 Group 的密钥(例如 createTime、groupName、members)从 Group 中获取所有密钥。现在,我们将对成员执行循环,以便获取成员的密钥。现在,在该循环中获取该成员的密钥时,我们想从用户中获取 comida_id,它将仅在该循环中获取。

GroupKey -> 获取数据(createTime, groupName, members, Restaurants) -> 获取成员密钥和 comida_id(在循环中(获取成员密钥然后获取 comida_id))

*我的代码

FirebaseDatabase mDatabase_gp = FirebaseDatabase.getInstance();
mDatabase_gp.getReference("Group/"+group_key).addValueEventListener(
                new ValueEventListener()
                {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot)
                    {

                        Map<String, Object> valuesMap = (HashMap<String, Object>) dataSnapshot.getValue();

                        Map userkey = (Map) valuesMap.get("members");
                        Log.d("Members", String.valueOf(userkey));

                        for (Object ke: userkey.keySet())
                        {
                            Log.d("runfirst","First Run");

                            String key = String.valueOf(ke.toString());
                            Log.d("Member key",key);


                            // HERE WHAT CORRESPONDS TO JOIN
                            FirebaseDatabase User = FirebaseDatabase.getInstance();
                            User.getReference("User/"+key).addValueEventListener(
                                    new ValueEventListener()
                                    {
                                        @Override
                                        public void onDataChange(DataSnapshot dataSnapshot)
                                        {
                                            Map<String, Object> valuesMap = (HashMap<String, Object>) dataSnapshot.getValue();

                                            String userid = String.valueOf(valuesMap.get("comida_id"));
                                            Log.d("comida_id",userid);
                                            Toast.makeText(ChatSectionActivity.this,userid,Toast.LENGTH_SHORT).show();
                                        }
                                        @Override
                                        public void onCancelled(DatabaseError databaseError)
                                        {
                                        }
                                    }
                            );
                        }

                        Log.d("runlast","Last Run");
                    }
                    @Override
                    public void onCancelled(DatabaseError databaseError)
                    {

                    }
                }
        );

*

在上面的代码中,我们尝试实现相同的目标,但这里代码将首先从组中获取所有成员键。获取所有成员后,它将在另一个循环中获取 comida_ids。因此,将有两个不同的循环从成员中获取 comida_id。它不像连接查询那样工作。

GroupKey -> get Data(createTime, groupName, members, Restaurants) -> fetch members key (in Loop (get member key) after then fetch comida_id .

*1) 我正在尝试这个解决方案 - How to perform join query in Firebase?

**但是得到这个错误-

Incompatible types.  
Required:   com.google.firebase.database.DatabaseReference 
Found:  com.google.firebase.database.ValueEventListener 

https://i.stack.imgur.com/ljlWo.png

【问题讨论】:

标签: android firebase firebase-realtime-database


【解决方案1】:

Firebase 没有加入查询。而你做错的是你在 Fireabaseuser 上引用你的数据库,这是错误的。

mdatabaseReference.child("Answer").child("Answer"+QID).orderByChild("questionId").equalTo(QID).addValueEventListener(new ValueEventListener() {

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

            if (muftiAnswer_List.size() > 0)
                muftiAnswer_List.clear();

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


                final AnswerClass muftiAnswer = postsnapshot.getValue(AnswerClass.class);


           String ide=muftiAnswer.getMuftiId(); //getting AlimId From Class object


                Log.e(TAG, "Alim:"+ muftiAnswer.getMuftiId());


                //Using Query to get Alim Name From Data Table.!
                mdatabaseReference.child("users").child("Alim").child(ide).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override      //.orderByChild("alimId").equalTo(user_Id)
                    public void onDataChange(DataSnapshot dataSnapshot) {

                        Log.e(TAG, "AlimNode:");


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

                            Log.e(TAG, "EqualNode:");


                            if(postSnapshot.getKey().equals("alimName"))
                            {
                                Log.e(TAG, "AlimNameNodeSnapShot:");

                                //Setting Alim Name in Current Object replcing id for name

                                muftiAnswer.setMuftiId(postSnapshot.getValue().toString());

                            }

                           // resultMuftiAnswer_List.add(muftiAnswer);

                        }//End of snapshot
                    }//ondata Change

                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                        // Failed to read value
                        Log.w(TAG, "Failed to read value.", databaseError.toException());
                    }
                });//End OF Alim Query
            }//end of comments

            circular_progress2.setVisibility(View.GONE);

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        Toast.makeText(Details_Activity.this, "LOLOLOL", Toast.LENGTH_SHORT).show();
        }
    });

您必须使用嵌套循环来执行 MYSQL

之类的连接
Query query = reference.child("issue").orderByChild("id").equalTo(0);
query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            // dataSnapshot is the "issue" node with all children with id 0
            for (DataSnapshot issue : dataSnapshot.getChildren()) {
                // do something with the individual "issues"
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

访问链接以获得更好的理解

https://firebase.googleblog.com/2013/10/queries-part-1-common-sql-queries.html

【讨论】:

  • 感谢您的回复,如果您了解我的问题,如何在查询下执行查询。实际上在第一个查询中从组中获取成员键列表,那时我使用 for 循环,当每个键获取然后创建对该实例的查询时,我从用户表中获取了该键信息。请帮我指出这一点
  • @DipeshKhatate 请检查答案
  • 谢谢,实际上查询没有得到准确的答案我想要做的是当第一个循环被调用时我从那个键中获取一个键我想使用那个键进行另一个查询并获取值.但现在我首先获取所有密钥,然后查询另一个循环,请参阅此链接上的数据库 - i.stack.imgur.com/ljlWo.png
  • 好吧,您在上面的示例中获得了一个 ide,然后使用该 ide 从 firebase 获取更多数据,如果您获取的所有数据仅用于使用 postSnapshot 的每个循环并获得唯一你想要的钥匙
  • @DipeshKhatate for(DataSnapshot postSnapshot:dataSnapshot.getChildren()) { Log.e(TAG, "EqualNode:"); if(postSnapshot.getKey().equals("alimName")) { Log.e(TAG, "AlimNameNodeSnapShot:"); //设置Alim Name in Current Object repling id for name muftiAnswer.setMuftiId(postSnapshot.getValue().toString()); }
猜你喜欢
  • 1970-01-01
  • 2017-04-29
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
相关资源
最近更新 更多