我为Ingredient创建了AutoCompleteTextView,它非常完美。数据库保存也有效,我已经过测试而没有验证。
如果Firebase db中存在Ingredient,我想将配方添加到DB。
例如,如果RecipeIngredients="milk"
配方应保存到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) {
}
});
答案 0 :(得分:3)
if(data.child("ingredientName").getValue().equals(RecipeIngredients))
解决了我的问题。
答案 1 :(得分:0)
试试这个
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();
}
});
答案 2 :(得分:0)
这种情况正在发生,因为您正在遍历整个对象。如果条件已满足,则设置该值,否则则为剩余的每个元素触发else部分。
要解决此问题,您可以删除其他部分(如果不需要),或者您需要使用Firebase提供的exists()
方法。要实现此目的,只需在同一个数据库引用上附加一个侦听器,并检查该子节点是否存在。
希望它有所帮助。