簡體   English   中英

訪問Firebase實時數據庫值

[英]Access Firebase realtime database values

我正在為我的開發人員團隊制作應用程序,我想為所有具有Firebase實時數據庫的登錄用戶添加應用程序版本編輯器,我使用代碼

appIdEndPoint = mDatabase.child("users").child(user.getUid()).child("app").child("id");
        appVersionEndPoint = mDatabase.child("users").child(user.getUid()).child("app").child("latest_version");
        uid_text.setText("User firebase ID: " + user.getUid());

        appIdEndPoint.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                appDetails address = dataSnapshot.getValue(appDetails.class);
                if (address.getID().equals("")){
                    appIdEndPoint.setValue(getRandom(1000, 9999));
                }
                appid_text.setText("App ID: " + address.getID());
                appid_edittext.setText(address.getID());
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.d("AppID", databaseError.getMessage());
                Toast.makeText(AppDetailsEditor.this, "Failed to fetch data from database", Toast.LENGTH_LONG);
                finish();
            }
        });

        appVersionEndPoint.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                appDetails address = dataSnapshot.getValue(appDetails.class);
                if (address.getVersion().equals("")){
                    appVersionEndPoint.setValue("Waiting for developers input");
                }
                appversion_text.setText("App version: " + address.getVersion());
                appversion_edittext.setText(address.getVersion());
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.d("AppVersion", databaseError.getMessage());
                Toast.makeText(AppDetailsEditor.this, "Failed to fetch data from database", Toast.LENGTH_LONG);
                finish();
            }
        });

我嘗試使用“字符串appID = dataSnapshot.getValue()。toString();” 但是它產生了java.lang.NullPointerException錯誤。 請有人可以編輯我的代碼以正確獲取數據庫值嗎? 這是“ appDetails.java”類:

public class appDetails {

public String ID = "";
public String version = "";

public appDetails(){

}

public appDetails(String ID, String version){
    this.ID = ID;
    this.version = version;
}

public String getID (){
    return ID;
}
public String getVersion (){
    return version;
}

}

編輯:

上面顯示的代碼也產生java.lang.NullPointerException錯誤

如果您的數據未保存在Firbease數據庫中,則需要更改如下規則:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

但是只是暫時更改規則,請不要那樣做。

您的代碼不是null安全的。 首先地址可以為空。 其次,getID可以為null。 無論如何這是更好的:

if (address.getID() == null || "".equals(address.getID())){
    appIdEndPoint.setValue(getRandom(1000, 9999));
}

由於您的數據庫當前為空,因此ValueListener.onDataChange()將使用空快照啟動。 您的代碼需要檢查以下內容:

appIdEndPoint.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    if (dataSnapshot.exists()) {
      appDetails address = dataSnapshot.getValue(appDetails.class);
      ...

您需要在任何ValueEventListener中進行此類檢查,以偵聽可能不存在的數據。

暫無
暫無

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

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