Android: Каждый раз, когда я сохраняю документ в Firestore, я не могу изменить Список внутри документа через RecyclerView. В чем проблема? - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть объект Card, внутри которого есть объекты List 'Interest'. Я пытаюсь сохранить свои карты в Firestore, чтобы я мог получить их позже. Однако каждый раз, когда я успешно сохраняю 'CArd' в базе данных, я не могу вносить изменения в каждый объект карты на моем устройстве. В частности, я не могу изменить каждый интерес в списке, присутствующем в. ie. Я не могу добавить новые Интересы к каждой Карте в HashMap: cardNameToCard

Может кто-нибудь помочь мне понять, что я делаю неправильно? Я подозреваю, что указатели памяти для каждой карты в моей CardMap меняются. Я попытался добавить новые адаптеры для каждого нового списка и каждой новой карты. Я также попытался сделать дубликат карты и передать эти данные в функцию, а затем ждать обратного вызова. Функция MainActivity, хранящая данные:

`publi c stati c MapcardNameToCard = new HashMap <> (); fs.storeCards (cardName, duplicateCardMapping, new MyCallBack () {

                    @Override
                    public void onCardStoredCallback(Map<String, Card> returnedCardMap) {

                        //cardNameToCard.putAll(returnedCardMap);
                        for(String cardName:returnedCardMap.keySet()){
                            cardNameToCard.get(cardName).setStoredInterests(returnedCardMap.get(cardName).storedInterests);
                        }

Вот как выглядит карта:

    String userEmailId;
    String cardName;
    List<Interest> storedInterests;
    boolean visible;

Это моя функция хранения в Firestore: она проверяет, Карта существует в базе данных. Если это так, она обновляется, в противном случае создается новый документ



    //need to confirm if working properly or not!
    public void storeCards(final String cardName, final Map<String,Card>cardNameToCard, final MyCallBack myCallBack) {
        Log.d(TAG,"STORING CARDS");
        FirebaseFirestore db=FirebaseFirestore.getInstance();

        db.collection("cards")
                .whereEqualTo("cardName",cardName)
                .whereEqualTo("userEmailId",Main3Activity.getThisUser().getEmail())
                .get()
                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                        Set<String> cardNamesUpdated=new HashSet<>();
                        for(QueryDocumentSnapshot documentSnapshot:queryDocumentSnapshots){
                            String idOfThisCard=documentSnapshot.getId();
                            cardNamesUpdated.add((String) documentSnapshot.getData().get("cardName"));
                            Card x=cardNameToCard.get(cardName);
                            List<Interest> interestCurrent=x.getStoredInterests();
                            List<Interest> alternateList=new ArrayList<>();
                            for(Interest i:interestCurrent){
                                if(i.getName().isEmpty()||i.getName()==null){
                                    alternateList.add(new Interest("",cardName));
                                }else {
                                    alternateList.add(i);
                                }
                                Log.d(TAG,"I AM ADDING "+i.getName());
                            }
                            cardNameToCard.get(cardName).storedInterests=alternateList;
                            updateOneCard(idOfThisCard, Objects.requireNonNull(cardNameToCard.get(cardName)).convertToMap(),cardNameToCard,myCallBack);//updating this guy
                        }
                        //cardNameSet.removeAll(cardNamesUpdated);//the guys who are new and need to be added as brand new cards
                        if(queryDocumentSnapshots.size()==0)//if we did not get any result on our search for this card\
                            addNewCard(cardName,cardNameToCard,myCallBack);
                    }
                });

    }

addNewCard и updateOneCard:


    //need to confirm if working properly or not!
    private void addNewCard(final String x, final Map<String, Card> cardNameToCard, final MyCallBack myCallBack) {
        //to ensure that the schema does not change in case of no interests added by user, we will create a blank interest
        if(cardNameToCard.get(x).getStoredInterests().isEmpty()){
            //Main3Activity.cardNameToCard
            Interest blankInterest=new Interest("",x);
            Card cardToReplace=cardNameToCard.get(x);
            cardToReplace.storedInterests=(new ArrayList<Interest>(Arrays.asList(new Interest[]{blankInterest})));
            cardNameToCard.replace(x,cardToReplace);
            Log.d(TAG,"WE HAVE ADDED A BLANK INTEREST IN CARDNAME "+x);
        }
        FirebaseFirestore db=FirebaseFirestore.getInstance();
        db.collection("cards")
                //.add(cardNameToCard.get(x).convertToMap())
                .add(cardNameToCard.get(x).convertToMap())
                .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                    @Override
                    public void onSuccess(DocumentReference documentReference) {
                        Log.d(TAG,"WE HAVE ADDED A NEW CARD"+x);
                        myCallBack.onCardStoredCallback(cardNameToCard);
                    }
                });
    }

    private void updateOneCard(String idOfThisCard, final Map<String, Object> data, final Map<String, Card> cardNameToCard,final MyCallBack myCallBack) {
        FirebaseFirestore db=FirebaseFirestore.getInstance();
        db.collection("cards")
                .document(idOfThisCard)
                .set(data)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.d(TAG,"WE HAVE UPDATED AN EXISTING CARD "+data.get("cardName"));
                        myCallBack.onCardStoredCallback(cardNameToCard);
                    }
                });
    }```



Any help would be appreciated!!!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...