在 Android Studio 上使用 Java 检查实时数据库上的重复数据

Posted

技术标签:

【中文标题】在 Android Studio 上使用 Java 检查实时数据库上的重复数据【英文标题】:Check duplicate data on Realtime Database with Java on Android Studio 【发布时间】: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之前,检查数组是否已经包含该值? 【参考方案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
    
    

【讨论】:

感谢您的回答,我会在注册新订单的方法上尝试一下,防止重复。

以上是关于在 Android Studio 上使用 Java 检查实时数据库上的重复数据的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 android studio/Java 上使用 .dae (collada) 文件?

在 Android Studio 上使用 Java 检查实时数据库上的重复数据

在 Unity 中使用 Android Studio 上的类

未找到 Java。 Android Studio 无法找到有效的 JVM。 (在 Mac 操作系统上)

Android Studio NDK基础使用

ActivityResultCallback 函数 onActivityResult 不会在某些设备上触发(Android Studio / Java)