【问题标题】:Firebase OrderByChild() and EqualTo() is not working properlyFirebase OrderByChild() 和 EqualTo() 无法正常工作
【发布时间】:2019-07-01 18:31:29
【问题描述】:

我需要在 Random Key 中找到现有的 Child,并且我已经使用 OrderByChild() 和 EqualTo() 来过滤查询,但它的行为很奇怪,有时它显示子只存在于一个 Child 而有时它不存在工作。

我需要检查“February_2019”的孩子(date_expense)是否存在?我试过这个

MainActivity

databaseReference = firebaseDatabase.getReference("Expenses_Details");
        expensesaddref = databaseReference.child(username).child("Expense_Month").child(monthyr); 
 int currentInt=Integer.parseInt(currentdate); 
        numberToWord((currentInt % 100));
        Log.d("date_string",String.valueOf(dateString)); 
        final String date_expense=expensesname +"" + dateString;
final ExpenseClass expenses=new ExpenseClass(expensesname,currentdate,date_expense,totalcost);

        expensesaddref.orderByChild("date_expense").equalTo(date_expense).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    Toast.makeText(getContext(), "Expense Already exists!!", Toast.LENGTH_SHORT).show();
                        }
                        else {
                            String key = expensesaddref.push().getKey();
                            expensesaddref.child(key).setValue(expenses);
                            showListAdd(expensesname);
                            Log.d("Adding", "Data Adding");
                        }





            }


            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        }}

注意

如果孩子已经存在于 db 中,那么它应该显示 toast 但即使孩子已经是 db,费用也会再次增加

在节目中,

monthYr 是 2019 年 2 月

Currentdate 是当前日期

dateString 是单词中的日期(即一、十一、二十)

这是我得到 .date_expense 正在添加的 Firebase 结构,即使子级已经存在

【问题讨论】:

  • 当您在调试器中运行该代码时会发生什么? onDataChange 是否被触发?如果有,dataSnapshot.exists() 是什么?
  • 另外请注意,如果您确定变量的所有值都是正确的,您还应该能够使用硬编码路径重现问题。这将有助于排除导致问题的任何变量。
  • onDatachange它的触发..如果孩子已经存在于数据库中,那么它应该显示吐司,但即使孩子已经是数据库,费用也会再次增加@Frank van Puffelen
  • 出于检查目的,我已经执行了这一行 expensesaddref.orderByChild("expensesName").equalTo(expensename) 它工作正常,但 expensesaddref.orderByChild("date_expense").equalTo(date_expense) 不工作
  • 听起来date_expense 没有正确的值。你能用date_expense 的硬编码值重现这个问题吗?

标签: android firebase android-studio firebase-realtime-database


【解决方案1】:

我发现下面的代码可以根据我的需要工作

ValueEventListener valueEventListener=new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                boolean isTitleAlreadyUsed = false;

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

                    if (ds.hasChild("date_expense") && (expDate.equals(ds.child("date_expense").getValue()))) {
                        isTitleAlreadyUsed = true;
                    }
                }
                if(isTitleAlreadyUsed){
                    Toast.makeText(getContext(),"Exist",Toast.LENGTH_SHORT).show();
                }else
                {
                    String key=expensesaddref.push().getKey();
                    expensesaddref.child(key).setValue(expenseClass);
                    showListAdd(lower_exp);
                    Toast.makeText(getContext(),"Added",Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        };
        expensesaddref.addListenerForSingleValueEvent(valueEventListener);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多