访问Firebase实时数据库值

时间:2017-08-07 10:27:01

标签: java android firebase firebase-realtime-database

我正在为我的开发团队制作应用程序,我想为所有登录用户添加应用版本编辑器,使用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();
            }
        });

我尝试使用" String 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错误

3 个答案:

答案 0 :(得分:0)

如果您的数据未保存在Firbease数据库中,则需要更改以下规则:

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

但暂时改变你的规则,请不要这样做。

答案 1 :(得分:0)

您的代码不是空的安全。首先地址可以为null。其次,getID可以为null。无论如何这更好:

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

答案 2 :(得分:0)

由于您的数据库当前为空,ValueListener.onDataChange()将使用空快照触发。您的代码需要检查:

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

您需要在侦听可能不存在的数据的任何ValueEventListener中进行此类检查。