У меня есть объект 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!!!