是否可以从GeoFirestore查询中删除当前用户?

问题描述

如果您要查询100公里半径内的用户,如何从查询中排除自己(当前用户)?

因为onDocumentMoved触发时(如果您是触发输入文档的唯一动作),您将再次获得用户,但您与用户间的距离不同,因此,如果将它们添加数据库中,则会得到重复的结果。 onDocumentEntered方法。我解决方法是在再次打开应用程序时从数据库删除所有usersInRange。我知道这不是完美的解决方案,我正在寻找更好的解决方案。

这是我的代码

  public void getLocation(Location location){
    ArrayList<String> docMoved = new ArrayList<>();
    listenerRegistration = documentReference.addSnapshotListener(new EventListener<DocumentSnapshot>() {
        @Override
        public void onEvent(@Nullable DocumentSnapshot value,@Nullable FirebaseFirestoreException error) {
            if(value != null && value.exists()){
                if (value.get("LocationRange") != null && value.get("AgeRangeFrom") != null && value.get("AgeRangeto") != null && value.getString("InterestInGender") != null) {
                    locationRange = (double) value.get("LocationRange");
                    ageRangeFrom = (double) value.get("AgeRangeFrom");
                    ageRangeto = (double) value.get("AgeRangeto");
                    interestInGender = value.getString("InterestInGender");
                    ArrayList<HashMap<Object,Object>> usersInRange = (ArrayList<HashMap<Object,Object>>) value.get("UsersInRange");

                    geoQuery = geoFirestore.queryAtLocation(new GeoPoint(location.getLatitude(),location.getLongitude()),locationRange);

                    geoQuery.addGeoQueryDataEventListener(new GeoQueryDataEventListener() {
                        @Override
                        public void onDocumentEntered(@NotNull DocumentSnapshot documentSnapshot5,@NotNull GeoPoint geoPoint) {
                            if (documentSnapshot5.get("age") != null && documentSnapshot5.getString("Gender") != null && documentSnapshot5.get("Images") != null && !documentSnapshot5.getId().equals(user.getUid())) {
                                age = (long) documentSnapshot5.get("age");
                                userGender = documentSnapshot5.getString("Gender");
                                userPhotos = (ArrayList<String>) documentSnapshot5.get("Images");

                                Location locationNew = new Location(documentSnapshot5.getId());
                                locationNew.setLatitude(geoPoint.getLatitude());
                                locationNew.setLongitude(geoPoint.getLongitude());

                                distanceM = location.distanceto(locationNew);
                                distanceKM = (int) Math.round(distanceM / 1000);


                                if (age >= ageRangeFrom && age <= ageRangeto && interestInGender.equals("Women") && userGender.equals("Woman")) {
                                    db.collection("UsersFilter").document(user.getUid()).update("UsersInRange",FieldValue.arrayUnion(new User(documentSnapshot5.getString("Name"),age,userPhotos.get(0),documentSnapshot5.getId(),distanceKM,null)));
                                } else if (age >= ageRangeFrom && age <= ageRangeto && interestInGender.equals("Men") && userGender.equals("Man")) {
                                    db.collection("UsersFilter").document(user.getUid()).update("UsersInRange",null)));
                                } else if (age >= ageRangeFrom && age <= ageRangeto && interestInGender.equals("Everyone")) {
                                    db.collection("UsersFilter").document(user.getUid()).update("UsersInRange",null)));
                                } else {
                                    db.collection("UsersFilter").document(user.getUid()).update("UsersInRange",FieldValue.arrayRemove(new User(documentSnapshot5.getString("Name"),null)));
                                }
                            }


                        }

                        @Override
                        public void onDocumentExited(@NotNull DocumentSnapshot documentSnapshot1) {
                            db.collection("UsersFilter").document(user.getUid()).get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                                @Override
                                public void onSuccess(DocumentSnapshot documentSnapshot) {
                                    ArrayList<HashMap<Object,Object>>) documentSnapshot.get("UsersInRange");
                                    if (usersInRange != null && !usersInRange.isEmpty()) {
                                        for (int i = 0; i < usersInRange.size(); i++) {
                                            if (usersInRange.get(i).containsValue(documentSnapshot1.getId())) {
                                                db.collection("UsersFilter").document(user.getUid()).update("UsersInRange",FieldValue.arrayRemove(usersInRange.get(i)));
                                            }
                                        }
                                    }
                                }
                            });
                        }


                        @Override
                        public void onDocumentMoved(@NotNull DocumentSnapshot documentSnapshot6,@NotNull GeoPoint geoPoint) {
                            docMoved.add(documentSnapshot6.getId());
                            if(!documentSnapshot6.getId().equals(user.getUid())) {
                                db.collection("UsersFilter").document(user.getUid()).get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                                    @Override
                                    public void onSuccess(DocumentSnapshot documentSnapshot) {
                                        ArrayList<HashMap<Object,Object>>) documentSnapshot.get("UsersInRange");
                                        if (usersInRange != null && !usersInRange.isEmpty()) {
                                            for (int i = 0; i < usersInRange.size(); i++) {
                                                if (usersInRange.get(i).containsValue(documentSnapshot6.getId())) {
                                                    db.collection("UsersFilter").document(user.getUid()).update("UsersInRange",FieldValue.arrayRemove(usersInRange.get(i)));
                                                }
                                            }
                                        }
                                    }
                                });
                            }
                        }

                        @Override
                        public void onDocumentChanged(@NotNull DocumentSnapshot documentSnapshot1,@NotNull GeoPoint geoPoint) {
                            if(docMoved.size() == 1 && docMoved.get(0).equals(user.getUid())){
                                db.collection("UsersFilter").document(user.getUid()).update("UsersInRange",FieldValue.delete());
                            }
                            db.collection("UsersFilter").document(user.getUid()).get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                                @Override
                                public void onSuccess(DocumentSnapshot documentSnapshot) {
                                    ArrayList<HashMap<Object,FieldValue.arrayRemove(usersInRange.get(i)));
                                            }
                                        }
                                    }
                                }
                            });
                        }


                        @Override
                        public void onGeoQueryReady() {

                        }

                        @Override
                        public void onGeoQueryError(@NotNull Exception e) {

                        }
                    });

                }
            }
        }
    });

这是在ViewPager2中显示用户代码

       listenerRegistration = documentReference.addSnapshotListener(new EventListener<DocumentSnapshot>() {
        @Override
        public void onEvent(@Nullable DocumentSnapshot value,@Nullable FirebaseFirestoreException error) {

            if(value != null && value.exists()) {
                usersInRange = (ArrayList<HashMap<Object,Object>>) value.get("UsersInRange");
                usersInChat = (ArrayList<HashMap<Object,Object>>) value.get("UsersInChat");

                imageUrls.clear();
                viewPager2Adapter.notifyDataSetChanged();

                if (usersInChat != null && !usersInChat.isEmpty() && usersInRange != null && !usersInRange.isEmpty()) {
                    for (int i = 0; i < usersInChat.size(); i++) {
                        for (int k = 0; k < usersInRange.size(); k++) {
                            if (usersInRange.get(k).containsValue(usersInChat.get(i).get("userID"))) {
                                usersInRange.remove(usersInRange.get(k));
                            }
                        }
                    }
                }

                if (usersInRange != null && !usersInRange.isEmpty()) {
                    for (int i = 0; i < usersInRange.size(); i++) {
                        String profileImage = (String) usersInRange.get(i).get("profilePic");
                        String userName = (String) usersInRange.get(i).get("name");
                        long userAge = (long) usersInRange.get(i).get("age");
                        String userID = (String) usersInRange.get(i).get("userID");
                        long km = (long) usersInRange.get(i).get("km");

                        imageUrls.add(new User(userName,userAge,profileImage,userID,km,null));

                        viewPager2Adapter.notifyDataSetChanged();

                    }
                }
            }
        }
    });

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)