Мне нужно найти существующий дочерний элемент внутри случайного ключа, и я использовал OrderByChild() и EqualTo() для фильтрации запросов, но он ведет себя так странно, что иногда он показывает, что дочерний элемент существует только для одного дочернего элемента, а иногда он не работает.
мне нужно проверить, существует ли ребенок (date_expense) "February_2019" или нет? я пробовал это
Основная деятельность
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) {
}
}}
Заметка
если дочерний элемент уже существует в БД, он должен отображать тост, но расходы снова добавляются, даже если дочерний элемент уже БД
В программе
monthYr
Currentdate
- дата текущего дня
dateString
- это дата в словах (то есть один, одиннадцать, двадцать)
Это структура Firebase, которую я получаю. date_expense
, хотя дочерний элемент уже существует
я обнаружил, что приведенный ниже код работает в соответствии с моими потребностями
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);