我正在开发一个应用程序:
在我的实时数据库中,我有这样的结构
但有些密钥有相同的数据,它是这样的副本:
在我的android studio项目中,我编写了这个函数,但只检索数据,不检查重复项:
private void deleteIfAreDuplicateData() {
List<Order> orderList = new ArrayList<>();
FirebaseDatabase.getInstance().getReference(Common.ORDER_REF)
.orderByKey()
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
ArrayList<Object> numeroDeOrden = new ArrayList<>();
String datos;
String pagoFinal, tiempo, idUsuario, nombreUsuario;
boolean exists = false;
for (DataSnapshot orderSnapshot : dataSnapshot.getChildren()) {
Map<String, Object> model = (Map<String, Object>) orderSnapshot.getValue();
pagoFinal = String.valueOf(orderSnapshot.child("finalPayment").getValue());
tiempo = String.valueOf(orderSnapshot.child("orderTime").getValue());
idUsuario = String.valueOf(orderSnapshot.child("userId").getValue());
nombreUsuario = String.valueOf(orderSnapshot.child("userName").getValue());
datos = (String) orderSnapshot.getKey();
numeroDeOrden.add(datos);
for (int i = 0; i < numeroDeOrden.size(); i++) {
if (model.get("finalPayment").equals(pagoFinal) && model.get("orderTime").equals(tiempo)) {
exists = true;
}
}
}
if(exists)
{
Toast.makeText(getContext(), "Tienes ordenes repetidas ", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
如何在数据库中检查重复项,以及在重复项出现时仅删除2个值中的一个(?)
2条答案
按热度按时间5m1hhzi41#
您可以将模型列表保存在活动中(或通常保存在活动中)
ViewModel
作为静态成员):然后,对于数据中的每个更改,您可以通过使用检查是否存在来仅将新数据添加到模型中
contains()
方法:dfty9e192#
如果要防止重复值,请将这些值用作数据的键。因此,在您的示例中,如果希望所有属性值的组合都是唯一的,请将所有这些值组合成一个字符串,并将其用作键。
您需要删除或编码任何键中不允许的字符,所以
.
,$
,[
,]
,#
,和/
,从键。另外,如果密钥的长度超过了768个字符的最大密钥长度,那么您也可以使用哈希函数或简单地截断字符串来减小密钥的大小。请参阅我的答案,了解更多信息:firebase错误:第一个参数的密钥路径长度超过768字节