【问题标题】:Check duplicate data on Realtime Database with Java on Android Studio在 Android Studio 上使用 Java 检查实时数据库上的重复数据
【发布时间】:2021-03-13 20:41:39
【问题描述】:

我正在开发一个应用程序:

在我的实时数据库中,我有这个结构

但有些键具有相同的数据,并且是这样的重复:

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

【问题讨论】:

  • 在将datos添加到arraylist之前,检查数组是否已经包含该值?

标签: java android database firebase firebase-realtime-database


【解决方案1】:

如果您想防止重复值,请将这些值用作数据的键。因此,在您的情况下,如果您希望所有属性值的组合是唯一的,请将所有这些值组合成一个字符串并将其用作您的键。

您需要从密钥中删除或编码任何不允许在密钥中使用的字符,例如 .$[]#/

此外,如果密钥长度超过 768 个字符的最大密钥长度,您还需要使用散列函数或简单地截断字符串来将其缩小。请在此处查看我的答案以获取更多信息:Firebase Error: First argument has a key path longer than 768 Bytes

【讨论】:

    【解决方案2】:

    您可以将模型列表保存在您的活动中(或通常在 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
        }
        
    }
    

    【讨论】:

    • 感谢您的回答,我会在注册新订单的方法上尝试一下,防止重复。
    猜你喜欢
    • 2019-04-25
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2013-04-24
    • 2021-03-11
    相关资源
    最近更新 更多