java - Firebase removeValue() 函数未删除正确的值
问题描述
我正在为我的应用程序添加编辑和删除功能。编辑功能工作正常,但我的删除功能并不总是删除正确的值。
删除功能无法按预期工作的场景:
当我添加一个新的数据节点(我的应用程序中的新供应商。)
当我编辑一个值时,最后一个编辑的值被删除,而不是被选中的那个。
启动应用程序时,仅删除一项会删除整个“供应商”。
必须单击两次删除按钮才能删除项目。
这是我的数据库的结构:
供应商 >>>
=============> 自动生成的密钥(例如 -LpmoJ8DjCvF23I2ymVg)
==================================================== =====> 供应商名称
==================================================== =====> 供应商地址
==================================================== =====> 供应商_电话号码
==================================================== =====> 供应商_电子邮件
这是我的删除函数,它是一个 onClickListener,并使用 AlertDialog 进行确认:
btnMenuDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final AlertDialog.Builder builder = new AlertDialog.Builder(SupplierMaintenance.this);
builder.setTitle("DELETE Supplier");
builder.setMessage("You are about to delete the selected supplier. Continue?");
builder.setCancelable(false);
builder.setNegativeButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//DELETE METHOD
databaseSupp = FirebaseDatabase.getInstance().getReference("SUPPLIERS");
final DatabaseReference mDatabase2 = databaseSupp;
mDatabase2.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull final DataSnapshot dataSnapshot2) {
for (final DataSnapshot snapshot : dataSnapshot2.getChildren()) {
if (snapshot.child("Supplier_Name").getValue(String.class).equals(suppName.getText().toString())) {
deletekey = snapshot.getKey().toString();
keyholder.setText(deletekey);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
mDatabase2.child(keyholder.getText().toString()).removeValue();
}
});
builder.setPositiveButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.show();
//DELETE METHOD END
}
});
为了删除一个值,我获取了该项目的自动生成键,并将其用作删除该键的整个节点的参考。这在我的编辑功能中可以正常工作,但在我的删除功能中却不行。
我认为它与 onDataChange 有关系,但我不确定。
注意:这些项目位于recyclerView中,用户可以随时编辑或删除它们。
我尝试移动 onDatachange 方法,将 removeValue() 函数移动到不同的位置,并在使用它之前在 TextView 中设置键以确保它是正确的键,但由于某种原因它不能作为意,删除未选择的其他项目。
我已经被这个问题困扰了 3 天,因为我是这种编程的初学者,这是我的第一个完整的应用程序。
如果您需要更多代码,我可以根据需要发布尽可能多的代码。
任何帮助是极大的赞赏 :)。
解决方案
我没有测试过代码,尝试掌握逻辑。欢迎任何疑问
btnMenuDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final AlertDialog.Builder builder = new AlertDialog.Builder(SupplierMaintenance.this);
builder.setTitle("DELETE Supplier");
builder.setMessage("You are about to delete the selected supplier. Continue?");
builder.setCancelable(false);
builder.setNegativeButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//DELETE METHOD
databaseSupp = FirebaseDatabase.getInstance().getReference("SUPPLIERS");
final DatabaseReference mDatabase2 = databaseSupp;
mDatabase2.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull final DataSnapshot dataSnapshot2) {
for (final DataSnapshot snapshot : dataSnapshot2.getChildren()) {
if (snapshot.child("Supplier_Name").getValue(String.class).equals(suppName.getText().toString())) {
deletekey = snapshot.getKey().toString();
keyholder.setText(deletekey);
mDatabase2.child(keyholder.getText().toString()).removeValue();
return;
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
});
builder.setPositiveButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.show();
//DELETE METHOD END
}
});
我希望供应商名称是唯一的
推荐阅读
- notepad++ - 如何在记事本++中对字符串列表进行多次搜索
- python - 如何仅使用 TfidfVectorizer 获得 TF?
- tensorflow - 如何在二维张量的第二维上使用 Tensorflows scatter_nd?
- javascript - Angular Service 返回带有未定义值的 Observable
- javascript - 如何创建包含异步调用的 Javascript (es5) 构造函数
- r - 在闪亮的仪表板中显示基于闪亮小部件的框
- c# - 试图将任何东西的数组放入方法参数中
- javascript - 消息在输入容器下方滑动
- android - getContentResolver() 方法不执行
- python - Pandavro:ModuleNotFoundError:没有名为“pandavro”的模块