亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么命令 transaction.update 在 carrelloAttuale.

為什么命令 transaction.update 在 carrelloAttuale.

呼啦一陣風 2023-04-26 14:16:00
我正在嘗試從云 Firestore 的文檔中獲取產品,然后將該產品放入購物車。當我(成功)閱讀該產品時,我嘗試將其放入在外部聲明的數組列表中,但除非我將 final 放入變量,否則它不起作用。這樣做,當我運行下面的代碼時,我成功地檢索了數據,但是操作 carrelloAttuale.prodotti.add(prod) 是在命令 transaction.update() 之后執行的,因此更新不會上傳與開始時沒有什么不同.//prendo l'utente                FirebaseAuth auth= FirebaseAuth.getInstance();                //mi salvo il codice del prodotto scannerizzato                final String codiceProdottoScannerizzato=String.valueOf(intentData);                final FirebaseFirestore db = FirebaseFirestore.getInstance();                final DocumentReference docRef = db.collection("carrelli").document(auth.getUid());                final DocumentReference docrefprodotti = db.collection("prodotti").document(codiceProdottoScannerizzato);                db.runTransaction(new Transaction.Function<Void>() {                    @Override                    public Void apply(Transaction transaction) throws FirebaseFirestoreException {                        DocumentSnapshot snapshot = transaction.get(docRef);                        final Carrello carrelloAttuale = snapshot.toObject(Carrello.class);我希望在調試日志中的 carrelloAttuale.prodotti.add(prod) 之后執行命令更新標簽的順序是:CARRELLO FB:0 PRODOTTO:Nome:latte
查看完整描述

2 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

數據從 Firestore 異步加載,因為它可能必須從服務器檢索。為防止阻止應用程序,主要代碼在檢索數據時繼續執行。然后,當數據可用時,您onComplete會被調用。


這意味著任何需要數據中的數據的代碼都必須在方法內部onComplete,或者從那里調用。所以像:


docrefprodotti.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {

    @Override

    public void onComplete(@NonNull Task<DocumentSnapshot> task) {

        if (task.isSuccessful()) {

            DocumentSnapshot document = task.getResult();

            if (document.exists()) {

                Prodotti prod=document.toObject(Prodotti.class);

                prod.id=codiceProdottoScannerizzato;

                prod.totalePezziCarrello=1;

                carrelloAttuale.prodotti.add(prod);

                Log.d(TAG, "PRODOTTO: " + prod.toString());

            } else {

                Log.d(TAG, "No such document");


            }

        } else {

            Log.d(TAG, "get failed with ", task.getException());

        }


        Log.d(TAG, "CARRELLO FB: " + carrelloAttuale.size());

        transaction.update(docRef, "prodotti", carrelloAttuale.getProdotti());

    }

});


查看完整回答
反對 回復 2023-04-26
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

“命令更新”在調用“carrelloAttuale.prodotti.add(prod)”之前執行,因為該onComplete()方法具有異步行為并立即返回。這意味著在數據庫更新操作完成之后的某個時間之后,偵聽器才會被調用。無法保證需要多長時間。根據您的連接速度和狀態,更新操作可能需要幾百毫秒到幾秒才能完成。

如果您想對該數據使用某些邏輯,則必須等到異步 Firebase 數據庫操作完成。這意味著您只能使用prod偵聽器回調本身內部的對象。

查看完整回答
反對 回復 2023-04-26
  • 2 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號