Alan Muñoz
Alan Muñoz

Reputation: 31

Check duplicate data on Realtime Database with Java on Android Studio

I'm developing an app:

In my realtime database I have this structure

Order

But some keys have the same data and it's a duplicate like this:

Data

In my Android Studio project I code this function but only retrieve the data but no check the duplicates:

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) {

            }
        });

How can I check for duplicate in the database and when I have the duplicates remove only one of the 2 values (?)

Upvotes: 0

Views: 870

Answers (2)

Zain
Zain

Reputation: 40830

You can have a list of your model saved in your activity (or typically in ViewModel as a static member):

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

Then for each change in data you can add only the new data to the model by checking if exists using contains() method:

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
    }
    
}

Upvotes: 0

Frank van Puffelen
Frank van Puffelen

Reputation: 598728

If you want to prevent duplicate values, use those values as the keys for the data. So in your case, if you want the combination of all property values to be unique, combine all of those values into a single string and use that as your key.

You'll want to remove or encode any characters that are not allowed in keys, so ., $, [, ], #, and /, from the key.

In addition, if the key becomes longer than the maximum key length of 768 characters, you'll want to reduce it down to size too with a hash function or by simply truncating the string. See my answer here for some more info on that: Firebase Error: First argument has a key path longer than 768 Bytes

Upvotes: 1

Related Questions