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

时间:2018-11-05 03:32:15

标签: 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));
        }
    }
}

1 个答案:

答案 0 :(得分:1)

  

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

由于在Set中添加了Model类型的不同对象,因此您获得重复数据。集合中的每个Model对象在内存中都有一个不同的地址,这就是集合中每个对象都不同的原因。 Set是扩展Collection的接口,因此,使用这样的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);
}