如何避免在Firestore中建立索引?

时间:2019-01-21 06:21:29

标签: android firebase firebase-realtime-database google-cloud-firestore

我已经在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

2 个答案:

答案 0 :(得分:0)

由于您使用的set没有任何选项,因此它将覆盖现有数据。但是您的要求是合并数据,因此必须使用merge选项,如下所示:

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

您可以阅读有关选项here的更多信息。

此外,还有一个不错的post,其中列出了setupdatecreate之间的区别。

答案 1 :(得分:0)

您可以使用更新和更改一个变量

 reference.document("documentname").update("field", variable)

 reference.document("documentname").set({
    field: variable
}, { merge: true });

或者...如果您必须更新整个对象,您可以使用:

 reference.document("documentname").set(newObject, { merge: true });

查看这篇文章: https://saveyourtime.medium.com/firebase-cloud-firestore-add-set-update-delete-get-data-6da566513b1b