Повторяющиеся данные при объединении запросов Firestore - PullRequest
0 голосов
/ 05 ноября 2018

Мой бэкэнд построен на Firestore, и нет логического OR для построения моих запросов, и поэтому, чтобы исправить это, я использую несколько запросов и объединяю их для имитации логического OR, запрос запроса и слияние работают отлично, но теперь есть еще одна проблема, я получаю дубликаты данных, и поэтому, чтобы исправить это, я решил создать HashSet и сохранить в нем свои объекты, но я все еще получаю дублирующиеся данные в хэш-наборе

Вот как я объединяю запросы:

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

c представляет собой сборник заданий

и вот как я храню свои данные (в моем собственном слушателе 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 голосов
/ 05 ноября 2018

теперь есть еще одна проблема: я получаю дублирующиеся данные, и поэтому, чтобы исправить это, я решил создать хэш-набор и сохранить в нем свои объекты, но я все еще получаю дублирующиеся данные в хэш-наборе

Вы получаете дубликаты данных, потому что вы добавляете в свой Set различные объекты типа Model. Каждый Model объект в вашем наборе имеет различный адрес в памяти, и поэтому каждый объект в вашем наборе отличается. Set - это интерфейс, который расширяет коллекцию, поэтому при использовании такой коллекции вы не можете знать, содержит ли поле в объекте то же значение, что и другое поле в другом объекте, если вы не укажете его.

Существует большая разница между Set и List. Если вы используете:

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 будет содержать только один элемент (без дубликатов).

Чтобы решить вашу проблему, вы можете использовать List или Set, но вам нужно заполнить нужную коллекцию объектов на основе условия, которое может быть:

if(!model.getName().equals("someName")) {
    list.add(model);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...