在androidstudio上用java检查实时数据库中的重复数据

wlzqhblo  于 2021-07-07  发布在  Java
关注(0)|答案(2)|浏览(423)

我正在开发一个应用程序:
在我的实时数据库中,我有这样的结构

但有些密钥有相同的数据,它是这样的副本:

在我的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个值中的一个(?)

5m1hhzi4

5m1hhzi41#

您可以将模型列表保存在活动中(或通常保存在活动中) ViewModel 作为静态成员):

pubic static List<Map<String, Object>> modelList;

然后,对于数据中的每个更改,您可以通过使用检查是否存在来仅将新数据添加到模型中 contains() 方法:

for (DataSnapshot orderSnapshot : dataSnapshot.getChildren()) {

    Map<String, Object> model = (Map<String, Object>) orderSnapshot.getValue();

    if (!modelList.contains(model)) { 
        modelList.add(model);

        // Add your rest of code for the incoming new/change of data
    }

}
dfty9e19

dfty9e192#

如果要防止重复值,请将这些值用作数据的键。因此,在您的示例中,如果希望所有属性值的组合都是唯一的,请将所有这些值组合成一个字符串,并将其用作键。
您需要删除或编码任何键中不允许的字符,所以 . , $ , [ , ] , # ,和 / ,从键。
另外,如果密钥的长度超过了768个字符的最大密钥长度,那么您也可以使用哈希函数或简单地截断字符串来减小密钥的大小。请参阅我的答案,了解更多信息:firebase错误:第一个参数的密钥路径长度超过768字节

相关问题