簡體   English   中英

如何從 Android 中的 Firebase 實時數據庫接收特定信息?

[英]How to receive specific information from Firebase Realtime db in Android?

我正在使用 Android Studio 和 Firebase 實時數據庫創建忠誠度應用程序。

使用該應用程序注冊的每個用戶都將有一個唯一的二維碼分配給他們的帳戶。

當用戶在應用程序中注冊時,這些信息會存儲在數據庫中,並會被回調到應用程序中。 數據庫方案可以在下面看到。

在此處輸入圖片說明

我正在嘗試使用事件監聽器從 firebase 回撥用戶的電子郵件地址:

 databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            String email = dataSnapshot.child("email").getValue().toString();

            Toast.makeText(HomeScreen.this, email
                    , Toast.LENGTH_SHORT).show();


        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            System.out.println("The read failed: " + databaseError.getCode());

        }
    });

聲明的實例:

 FirebaseDatabase database = FirebaseDatabase.getInstance();
 databaseReference = database.getReference("Customers");
 firebaseAuth = FirebaseAuth.getInstance();
 firebaseUser = firebaseAuth.getCurrentUser();

運行時我不斷收到空指針異常。

2019 年 12 月 4 日 12:45:47.714 25381-25381/com.example.alicearmstrong.coffeysloyalty E/AndroidRuntime:致命異常:主進程:com.example.alicearmstrong.coffeysloyalty,PID:253388000 異常點在 com.example.alicearmstrong.coffeysloyalty.HomeScreen$1.onDataChange(HomeScreen.java:71) 在 com.google.firebase 的空對象引用上調用虛擬方法“java.lang.String java.lang.Object.toString()” .database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.0.4:75) 在 com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase -database@@16.0.4:63) 在 com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@16.0.4:55) 在 android.os。 Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread) .java:7356) 在 java.lang.reflect.Method.invoke(Na tive Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

有誰能幫忙解決嗎?

您需要在隨機 id 內迭代才能檢索email字段:

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
  for(DataSnapshot ds : dataSnapshot.getChildren()){
    String email = ds.child("email").getValue().toString();

    Toast.makeText(HomeScreen.this, email
            , Toast.LENGTH_SHORT).show();
    }
}

不,你做錯了。

根據您的數據庫架構判斷,您的databaseReference.addValueEventListener(...)調用使您可以訪問數據快照,它基本上是所有 uID 的列表。

因此,當您執行database.child("email").getValue().toString() ,它必然為 null,因為 datasnapshot 僅包含 uId 對象,而沒有直接的 email 屬性。 它總是會導致 NullPointerException。

解決方案:

由於您正在嘗試檢索特定用戶的電子郵件,只需將用戶的 id 添加到您的 databaseReference 對象中,這樣,您就可以通過其余方法直接獲取電子郵件。

這是一個插圖:

// this variable represents the uId of specific user you want to retrieve the email of
String userId = "INSERT_USERID_HERE";

// add userId above as a child to your databaseReference object
databaseReference = database.getReference("Customers").child("userId");

// valueEventListener call
databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String email = dataSnapshot.child("email").getValue().toString();
        Toast.makeText(HomeScreen.this, email, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        System.out.println("The read failed: " + databaseError.getCode());
    }
  });
}

暫無
暫無

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

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