簡體   English   中英

如何使用 Android 獲取 FireStore 生成的唯一用戶 ID?

[英]How Can I get Unique UserID generated by FireStore using Android?

package com.example.finaltry;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QuerySnapshot;

import java.util.ArrayList;
import java.util.List;

public class VendorDisplayActivity extends AppCompatActivity {

    private static final String TAG = "TAG";
    TextView textViewVendorName;
    ImageView vendorImage;
    RatingBar rating;

    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
    CollectionReference vendor_inventory_details_Ref = db.collection("Vendor_Details");
    DocumentReference ven_Ref = db.document("Vendor_Details");

    String sid ;
    RecyclerView mRecyclerView;

    //this is just for try of AP
    List<ProductModel> modelList = new ArrayList<>();
    RecyclerView.LayoutManager layoutManager;
    ProductCustomAdapter adapter;
    Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_vendor_display);

        final String vname=getIntent().getStringExtra("v_name");
        final String pid=getIntent().getStringExtra("p_id");

        Toast.makeText(getApplicationContext(),vname,Toast.LENGTH_SHORT).show();

        textViewVendorName = findViewById(R.id.textViewVendorName);
        vendorImage = findViewById(R.id.imageViewVendor);
        rating = findViewById(R.id.ratingBarVendor);
        context = this;

        mRecyclerView =findViewById(R.id.recyclerview_Product);

        //set recycler views properties
        mRecyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(getApplicationContext());
        mRecyclerView.setLayoutManager(layoutManager);


        vendor_inventory_details_Ref
                .whereEqualTo("Brand_Name",vname)
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                                            @Override
                                           public void onComplete(@NonNull Task<QuerySnapshot> task) {
                                               Log.d(TAG,"Step2 ");
                                               for (DocumentSnapshot doc: task.getResult()){
                                                   sid=doc.getId();
                                                   Log.d(TAG,"Step3 ");

                                               }
                                               Log.d(TAG,"Step4 ");
                                               Toast.makeText(getApplicationContext(),sid,Toast.LENGTH_SHORT).show();

                                           }
                                       }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.d(TAG,"Step5 ");

                Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_SHORT).show();

            }
        });

        //Toast.makeText(getApplicationContext(),pid,Toast.LENGTH_SHORT).show();
       // sid="N1GQdOXUSLRS1dREfu5SltVKoBb2";
        Toast.makeText(getApplicationContext(),vname,Toast.LENGTH_SHORT).show();
        vendor_inventory_details_Ref.document(sid).collection("Inventory")
                                .get()
                                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                                    @Override
                                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                                        modelList.clear();
                                        for (DocumentSnapshot doc : task.getResult()) {
                                            ProductModel productModel = new ProductModel(doc.getString("ProductName"),
                                                    doc.getString("Rate"), doc.getString("ProductId"));
                                            modelList.add(productModel);
                                        }
                                        adapter = new ProductCustomAdapter(VendorDisplayActivity.this, modelList, context);
                                        mRecyclerView.setAdapter(adapter);
                                    }
                                }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {

                                Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
                            }
                        });






    }
}

我的問題是我們如何生成 sid,因為當我為 sid 設置靜態值時,應用程序運行正常。 如果 sid 未給出,則錯誤是 :NullPointerException 如果我刪除注釋並將靜態值放入 sid,它可以工作此外,我正在創建從事件管理器配置文件到供應商配置文件的搜索功能,那么如何解決這個問題。

Firebase 截圖:

get()是異步的,並在查詢結果完成之前立即返回。 您的回調將在一段時間后與結果一起調用。

現在,您的代碼假設查詢立即發生並且sid的值在get()返回后立即可用。 這不是一個有效的假設。 如果你想使用 Firestore 查詢的結果,你應該只在查詢完成后使用它,這意味着它只能在回調中處理,或者使用其他一些保證后續代碼只在結果可用后觸發的系統.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM