Java 如何验证/检查Firebase数据库(Android)中是否存在字符串值

Java 如何验证/检查Firebase数据库(Android)中是否存在字符串值,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我已经为配料创建了AutoCompleteTextView,它工作得非常完美。DB save也可以工作,我已经在没有验证的情况下对它进行了测试。 若Firebase db中存在成分,我想将配方添加到db中。 例如,如果配方应保存到数据库中 这是我的密码 DatabaseReference ingDBref = FirebaseDatabase.getInstance().getReference("Ingredients"); DatabaseReference databaseReferenc

我已经为配料创建了AutoCompleteTextView,它工作得非常完美。DB save也可以工作,我已经在没有验证的情况下对它进行了测试。 若Firebase db中存在成分,我想将配方添加到db中。 例如,如果配方应保存到数据库中

这是我的密码

DatabaseReference ingDBref = FirebaseDatabase.getInstance().getReference("Ingredients");
DatabaseReference databaseReference=FirebaseDatabase.getInstance().getReference("Recipes");

public void addRecipe(){
        final String RecipeName=RecipeNameEditText.getText().toString();
        final String RecipePrepareTime=PrepareTimeEditText.getText().toString();        
        final String RecipeIngredients=IngredientsACTV.getText().toString();
        final String RecipeDescription=DescriptionEditText.getText().toString();
        final String RecipeDifficulty=DifficultySpinner.getSelectedItem().toString();
        key=databaseReference.push().getKey();

        ingDBref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot data: dataSnapshot.getChildren()){
                    if(data.child(RecipeIngredients).getValue()!=null){                   

                        Recipes recipes=new Recipes(key,RecipeName,RecipeDifficulty,RecipePrepareTime,RecipeIngredients,RecipeDescription);
                        databaseReference.child(key).setValue(recipes);
                        Toast.makeText(AddRecipeActivity.this,"Saved...",Toast.LENGTH_LONG).show();

                    }
                    else{
                        IngredientsACTV.setText("");
            Toast.makeText(AddRecipeActivity.this,"Error...",Toast.LENGTH_LONG).show();
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

试试这个

mDatabase.child("Ingredients")
                    .addChildEventListener(new ChildEventListener() {
                        @Override
                        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                            Map<String, String> map = (Map<String, String>) dataSnapshot.getValue();

                          String value=map.get("IngredientName"); 
                          // here will be your value of IngredientName

                          if(value.equals("Milk"){
                           // do something
                           }
                        }

                        @Override
                        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                            myDialog.CancelProgressDialog();
                        }

                        @Override
                        public void onChildRemoved(DataSnapshot dataSnapshot) {
                            myDialog.CancelProgressDialog();
                        }

                        @Override
                        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
                            myDialog.CancelProgressDialog();
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            myDialog.CancelProgressDialog();
                        }
                    });
mDatabase.child(“成分”)
.addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
Map Map=(Map)dataSnapshot.getValue();
字符串值=map.get(“IngreditName”);
//以下是您的IngCreditName值
如果(值等于(“牛奶”){
//做点什么
}
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
myDialog.CancelProgressDialog();
}
@凌驾
ChildRemoved上的公共void(DataSnapshot DataSnapshot){
myDialog.CancelProgressDialog();
}
@凌驾
已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
myDialog.CancelProgressDialog();
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
myDialog.CancelProgressDialog();
}
});

发生这种情况是因为您在整个对象中循环。如果条件已满足,则您可以设置该值,如果不满足,则为其余每个元素触发else部分

要解决此问题,如果不需要,您可以删除else部分,或者需要使用Firebase提供的
exists()
方法。要实现此目的,只需在同一数据库引用上附加一个侦听器,并检查该子项是否存在

希望能有帮助

if(data.child("ingredientName").getValue().equals(RecipeIngredients))

解决了我的问题。

您的代码中有什么错误?它总是执行“else”语句
RecipeingElements的值是多少?
?您能用硬编码的值重现问题吗?例如,如果我尝试
RecipeingElements=“milk”
if(data.child(RecipeIngredients.exists())仍然只触发else部分。真正的部分没有执行。即使我尝试过这种方法,也没有执行过。结果也是一样的。您需要在特定的子项上使用它。该键应该是字符串而不是对象。
RecipeIngElements
是字符串,您可以在我的代码中看到:
String RecipeIngElements=IngCreditsACTV.getText().toString();
您需要在键上使用它,而不是在值上使用它。
RecipeIndents
是键的值。您需要在响应的键上使用exists()。