Java 如何验证/检查Firebase数据库(Android)中是否存在字符串值
我已经为配料创建了AutoCompleteTextView,它工作得非常完美。DB save也可以工作,我已经在没有验证的情况下对它进行了测试。 若Firebase db中存在成分,我想将配方添加到db中。 例如,如果配方应保存到数据库中 这是我的密码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
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()。