在 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 操作系统上)
ActivityResultCallback 函数 onActivityResult 不会在某些设备上触发(Android Studio / Java)