java - 合并 Firestore 查询时出现重复数据

标签 java android firebase google-cloud-firestore

我的后端是在 Firestore 上构建的,没有逻辑 OR 来构建我的查询,因此为了解决这个问题,我使用多个查询并将它们合并来模拟逻辑 OR,查询请求和合并工作完美,但现在还有另一个问题,我得到了重复的数据,因此为了解决这个问题,我决定创建一个 HashSet 并将我的对象存储在其中,但我仍然在哈希集中获取重复的数据

以下是我合并查询的方法:

    Tasks.whenAllSuccess(c).addOnSuccessListener(new BaseValueOnSuccessListener(mapper, firebaseCallback));

c是Task的集合

这是我存储数据的方式(在我的自定义 BaseValueOnSuccessListener 监听器中):请检查我的 OnSuccess 方法

public class BaseValueOnSuccessListener<Model, Entity> implements OnSuccessListener<List<QuerySnapshot>> {
    private FirebaseMapper<Entity, Model> mapper;
    // FirebaseDatabaseRepositoryCallback is an interface
    private FirebaseDatabaseRepository.FirebaseDatabaseRepositoryCallback<Model> callback;

    public BaseValueOnSuccessListener(FirebaseMapper<Entity, Model> mapper,
                                      FirebaseDatabaseRepository.FirebaseDatabaseRepositoryCallback<Model> callback) {
        this.mapper = mapper;
        this.callback = callback;
    }


    @Override
    public void onSuccess(List<QuerySnapshot> querySnapshots) {
        // Do what you need to do with your list
        if (!querySnapshots.isEmpty()) {
            // List<Model> data = new ArrayList<>();
            Set<Model> data = new HashSet<>();
            for (QuerySnapshot querySnapshot : querySnapshots) {
                data.addAll(mapper.mapList(querySnapshot));
            }
            callback.onSuccess(new ArrayList<Model>(data));
        }
    }
}

最佳答案

now there's another problem I get duplicate data, and so to fix this I decided to create a hashset and store my objects in it, but I still get duplicate data in a hashset

您获得重复数据是因为您在 Set 中添加了 Model 类型的不同对象。集合中的每个 Model 对象在内存中都有不同的地址,这就是集合中的每个对象都不同的原因。 Set 是一个扩展 Collection 的接口(interface),因此在使用这样的集合时,您无法知道一个对象中的某个字段是否与另一个对象中的另一个字段具有相同的值,除非您指定它。

SetList 之间有很大的区别。如果您正在使用:

List<String> list = new ArrayList<>();
list.add("user2426691");
list.add("user2426691");
list.add("user2426691");
Log.d(TAG, list.toString());

您将看到您的列表将包含三个重复的名称。但是,如果您使用Set 字符串,如以下代码行所示:

Set<String> set = new HashSet<>(list);
Log.d(TAG, set.toString());

您可能会注意到,您的Set 将仅包含一个元素(无重复项)。

要解决您的问题,您可以使用 ListSet,但您需要根据条件填充所需的对象集合,该条件可能是:

if(!model.getName().equals("someName")) {
    list.add(model);
}

关于java - 合并 Firestore 查询时出现重复数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53147956/

相关文章:

android - com.google.android.gms.location.LocationListener 在我的 Activity 中不起作用

java - 如何以编程方式获取 contentPlaceHolder 的代码

Firebase 用户 photoURL 和 displayName

firebase - Firebase Cloud Functions 是否有触发限制?

java - 根据 Switch Case 中的字母计算分数

java - JPA - 带有 "WHERE"子句的 CriteriaQuery

java - https://plugins.gradle.org/m2/发生了什么?

java - Java 源文件是否可以在编译时运行任意代码?

java - 如何在android图库中显示10分钟前拍摄的图像?

java - 如何将文件/位图上传到 Cloud Firestore?