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

Posted

技术标签:

【中文标题】合并 Firestore 查询时出现重复数据【英文标题】:Duplicate data when I merge Firestore queries 【发布时间】:2018-11-05 03:32:14 【问题描述】:

我的后端是在 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));
        
    

【问题讨论】:

【参考方案1】:

现在还有另一个问题,我得到了重复数据,因此为了解决这个问题,我决定创建一个哈希集并将我的对象存储在其中,但我仍然在哈希集中得到重复数据

您正在获取重复数据,因为您正在添加 SetModel 类型的不同对象。您的 in 集合中的每个 Model 对象在内存中都有不同的地址,这就是为什么您的集合中的每个对象都不同的原因。 Set 是一个扩展 Collection 的接口,所以当使用这样的集合时,你无法知道一个对象中的一个字段是否与另一个对象中的另一个字段具有相同的值,除非你指定它。

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

【讨论】:

完美,再次感谢 Alex,你是最棒的!

以上是关于合并 Firestore 查询时出现重复数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在android Firestore上实现Paginate查询[重复]

与熊猫外部合并时出现重复问题

选择 SQL 查询时出现双倍结果 [重复]

在android中对SQLite Db执行查询时出现NullPointerException [重复]

运行 BigQuery 的应用脚本脚本时出现神秘重复

在 Android Studio Firestore 中获取查询时出现错误