Как избежать индекса в пожарном магазине? - PullRequest
0 голосов
/ 21 января 2019

Я создал базу данных в firestore и успешно загрузил тестовые данные.Но позже я заметил, что некоторые данные отсутствуют в базе данных.Я обнаружил, что при загрузке одних и тех же записей с другим значением для некоторых полей старая запись заменяется новой.Я чувствую, что это проблема дизайна базы данных.Мне нужно собрать и сохранить все записи, даже если это дубликаты записей на уровне всей записи.

Не могли бы вы дать мне знать, как это сделать?

private void exportToFireStore() {
    // Access a Cloud Firestore instance from your Activity
    final FirebaseFirestore db = FirebaseFirestore.getInstance();

    /*  ----------------_-------Collection delete is not supported-----------------------
        ----------Hence get all the document (coins) for individual Docs delete----------
    */

    //-------------------------------  Getting document (coins) Ends  ---------------------------------------------
    final List<String> coinsFromFirestore = new ArrayList<>();

    db.collection("cryptos").document(userEmailID).collection("coin")
            .whereEqualTo("createdBy", userEmailID)
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (QueryDocumentSnapshot document : task.getResult()) {
                            System.out.println("Testing 1 Batch Read done" + document.getData());
                            coinsFromFirestore.add(document.getData().get("coinname").toString());
                        }

                        //-------------------------------  Getting document (coins) Ends  ---------------------------------------------


                        if(coinsFromFirestore.size()>0){

                            for (int i=0;i<coinsFromFirestore.size();i++) {

                                if ( i<(coinsFromFirestore.size()-1) ) {
                                    db.collection("cryptos").document(userEmailID).collection("coin").document(coinsFromFirestore.get(i))
                                            .delete()
                                            .addOnSuccessListener(new OnSuccessListener<Void>() {
                                                @Override
                                                public void onSuccess(Void aVoid) {
                                                    System.out.println("Testing 1 Successfully Deleted the document "  );
                                                }
                                            })
                                            .addOnFailureListener(new OnFailureListener() {
                                                @Override
                                                public void onFailure(@NonNull Exception e) {
                                                    System.out.println("Testing 1 Error Deleting the document ");
                                                }
                                            });
                                }else{  
                                    db.collection("cryptos").document(userEmailID).collection("coin").document(coinsFromFirestore.get(i))
                                            .delete()
                                            .addOnSuccessListener(new OnSuccessListener<Void>() {
                                                @Override
                                                public void onSuccess(Void aVoid) {
                                                    addTranToFireBaseeNow(db);
                                                }
                                            })
                                            .addOnFailureListener(new OnFailureListener() {
                                                @Override
                                                public void onFailure(@NonNull Exception e) { 
                                                }
                                            });
                                    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! For last coin Ends  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                                }
                            }
                        }else{
                            addTranToFireBaseeNow(db);
                        }

                    } else {
                        Log.d(TAG, "Error getting documents: ", task.getException());
                    }
                }
            });
    //-------------------------------  Getting document (coins) Ends  ---------------------------------------------


}

private void addTranToFireBaseeNow(FirebaseFirestore db) {
    WriteBatch batch = db.batch();
    DocumentReference newCoinRef;
    //CollectionReference cryptos = db.collection("cryptos");
    List<Tran> tranList = getAllTranForFireStore();

    String firebaseUID = FirebaseAuth.getInstance().getCurrentUser().getUid();
    for (Tran t : tranList) { 
        Map<String, Object> tranData = new HashMap<>();
        tranData.put("firebaseid", firebaseUID);
        tranData.put("createdBy", userEmailID);
        tranData.put("coinid", t.getCoinID());
        tranData.put("coinname", t.getCoinName());
        tranData.put("coinsymbol", t.getCoinSymbol());
        tranData.put("date", String.valueOf(t.getDate()));
        tranData.put("qty", String.valueOf(t.getQty()));
        tranData.put("price", String.valueOf(t.getPrice()));
        tranData.put("priceunit", String.valueOf(t.getPriceUnit()));
        newCoinRef= db.collection("cryptos").document(userEmailID).collection("coin").document(t.getCoinName());
        batch.set(newCoinRef, tranData);
    }
    batch.commit().addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            // ... 
        }
    });
}

enter image description here

Для моей БД не настроен индекс

enter image description here

1 Ответ

0 голосов
/ 21 января 2019

Поскольку вы используете set без каких-либо опций, существующие данные будут перезаписаны. Но ваше требование - объединить ваши данные, поэтому вы должны использовать опцию объединения следующим образом:

batch.set(newCoinRef, tranData, SetOptions.merge());

Подробнее об опциях можно прочитать здесь .

Кроме того, есть хороший пост , в котором перечислены различия между set, update и create.

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