Firebase子项是否存在于android下随机键

时间:2018-01-23 21:12:52

标签: android firebase firebase-realtime-database

我是android开发的新手。首先看一下图片。

enter image description here

我现在遇到的问题,我不能在“每日膳食”部分检查孩子是否存在。我可以在“BazarList”上轻松检查孩子,因为没有随机生成的密钥。

这是孩子存在检查“BazarList”的代码,它运行正常。

 DatabaseReference dr= FirebaseDatabase.getInstance().getReference("BazarList");

    dr.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {


     if (dataSnapshot.child(bzs.getDate()).exists()) {
                    ExistD();

                }
                else {



                        Bazar bz = new Bazar(dt, ct, nm, it);
                        dr.child(dt).setValue(bz);
                        dataInsert();

                    }
}

现在我的问题是如何检查“每日膳食”的孩子(日期)是否存在? 我试过这个

  DatabaseReference databaseBazars= FirebaseDatabase.getInstance().getReference("Daily Meal");

final MealE user = new MealE(
            md.getText().toString().trim(),
            rb.getText().toString().trim(),
            rb2.getText().toString().trim(),
            rb3.getText().toString().trim(),
            rb4.getText().toString().trim(),
            rb5.getText().toString().trim(),
            rb6.getText().toString().trim(),
            rb7.getText().toString().trim());


    databaseBazars.addListenerForSingleValueEvent(new ValueEventListener() {

                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    if (dataSnapshot.child(user.getDate()).exists()) {


                       ExistD();

                    }


                    else {
                        if (!TextUtils.isEmpty(dt))
                        {
                            String id = databaseBazars.push().getKey();
                            MealE bz = new MealE(dt, s1, s2, s3, s4, s5, s6, s7);
                            databaseBazars.child(id).setValue(bz);
                            openDialog();
                        }
                        else {

                            MissingDAte();
                        }

                    }
                }


                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });





        }

如果你认为为什么我没有像“BazarList”那样做“Daily Meal”部分,那么这是一件事吗?有答案。在这种情况下,firebase会自动对数据进行排序,这意味着如果我插入1然后是4然后11,那么在firebase中它会自动加入1,11,4。那么问题。当我试图检索它时,它不会顺序返回。这就是为什么我需要将这些值放在随机生成的密钥中。

2 个答案:

答案 0 :(得分:2)

使用等于日期的查询,该查询将显示符合条件的所有子项。

Query dateQuery = FirebaseDatabase.getInstance().getReference("Daily Meal").orderByChild("date").equalTo(user.getDate());

dateQuery.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                if (dataSnapshot.exists()) {
                   ExistD();
                } else {
                    if (!TextUtils.isEmpty(dt))
                    {
                        String id = databaseBazars.push().getKey();
                        MealE bz = new MealE(dt, s1, s2, s3, s4, s5, s6, s7);
                        databaseBazars.child(id).setValue(bz);
                        openDialog();
                    } else {
                        MissingDAte();
                    }
                }
            }
        // put rest of your code here
});

查看the documentation以查看有关查询的更多信息。

答案 1 :(得分:0)

改变这个:

 if (dataSnapshot.child(user.getDate()).exists()) {

进入这个:

 if (dataSnapshot.child("date").exists()) {
数据库中的

Daily Meal下的孩子被称为date而不是它的价值。

试试这个:

   Query dateQuery = FirebaseDatabase.getInstance().getReference("Daily Meal");

   dateQuery.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot data: dataSnapshot.getChildren()){
                     String keys=data.getKey();
                   if(dataSnapshot.child(keys).child("date").exists()){
                   ExistD();
                    }

                }
            }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });