我试图限制,如果程序名称已经存在并且连接的值不存在,则推送连接的值,否则什么都不做,但我的连接值仍然被推送到数据库中。
代码如下:
public void addProgramAndDepartmentName(String programName, String departmentName) {
final DatabaseReference rootRef;
rootRef = FirebaseDatabase.getInstance().getReference();
String programAndDepartmentName = programName + departmentName;
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if ( !(snapshot.child("Program & Departments").child(programName).exists()) ) {
rootRef.child("Program & Departments").child(programName).push().child("Program Name").setValue(programAndDepartmentName).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
/*AddCourses addProgramNameToSpinnerInAddCourse = new AddCourses();
addProgramNameToSpinnerInAddCourse.getDataIntoSpinnerFromFirebase();
addProgramNameToSpinnerInAddCourse.spinnerArrayAdapter.notifyDataSetChanged();*/
if (!task.isSuccessful()) {
Toast.makeText(AddPrograms.this, "Program and Department is not Added into Database.", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(AddPrograms.this, "Program and Department name is added into Database if.", Toast.LENGTH_SHORT).show();
loadingBar.dismiss();
}
}
});
}
else if( (snapshot.child("Program & Departments").child(programName).exists() ) &&
( !( snapshot.child("Program & Departments").child(programName).child("Program Name").child(programAndDepartmentName).exists() ) ) ) {
rootRef.child("Program & Departments").child(programName).push().child("Program Name").setValue(programAndDepartmentName).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
/*AddCourses addProgramNameToSpinnerInAddCourse = new AddCourses();
addProgramNameToSpinnerInAddCourse.getDataIntoSpinnerFromFirebase();
addProgramNameToSpinnerInAddCourse.spinnerArrayAdapter.notifyDataSetChanged();*/
if (!task.isSuccessful()) {
Toast.makeText(AddPrograms.this, "Program and Department is not Added into Database.", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(AddPrograms.this, "Program and Department name is added into Database else if.", Toast.LENGTH_SHORT).show();
loadingBar.dismiss();
}
}
});
}
else {
Toast.makeText(AddPrograms.this, "This " + programName + " already Exists.", Toast.LENGTH_SHORT).show();
loadingBar.dismiss();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
但唯一正常工作的条件是第一个条件之后并且不工作
这是我的 JSON 文件:
{
"Program & Departments" : {
"Bs" : {
"-MV4Heye6EkKPMFlL9IX" : {
"Program Name" : "Bscs"
},
"-MV4Hfy_MHv0CVCnlsRZ" : {
"Program Name" : "Bscs"
}
}
}
}
请指导我哪里错了?
答案 0 :(得分:0)
如果您希望存在具有特定值的单个节点,请将该值作为该节点的键:
{
"Program & Departments" : {
"Bs" : {
"Bscs": true
}
}
}
使用这种结构,路径 /Program & Departments/Bs/Bscs
保证只存在一次,因为 JSON 只能包含该路径一次。
然后您可以检查路径是否存在,如果不存在,则使用单个事务创建它:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = rootRef.child(programName).child(programAndDepartmentName);
ref.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
if (!mutableData.exists())
mutableData.setValue(true);
}
return Transaction.success(mutableData)
}
@Override
public void onComplete(DatabaseError databaseError, boolean committed, DataSnapshot currentData) {
Log.d(TAG, "runTransaction:" + databaseError);
}
});