2017-08-14 49 views
0

我想從firebase數據庫的business_info節點下的PjSxhQXCyXdSv07LxVzU7buvhkF2中讀取'resName'和'status'值,如here嘗試在空對象引用上調用虛方法 - Firebase數據庫android

我不斷收到此錯誤:

Attempt to invoke virtual method 'java.lang.String com.example.android.project_water.Utilities.RestaurantInformation.getResName()' on a null object reference.

有誰知道如何解決這個問題?請讓我知道是否需要更多信息。

代碼:

public class Info extends Fragment { 

     private DatabaseReference mDatabase; 
     private FirebaseAuth firebaseAuth; 
     private String businessID; 
     private TextView resNameChange, statusChange; 

     public Info() { 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 

      View rootView = inflater.inflate(R.layout.fragment_info, container, false); 

      SharedPreferences businessID1 = getActivity().getSharedPreferences("BUSINESS_ID", Context.MODE_PRIVATE); 
      businessID = businessID1.getString("businessID", "businessIDNotFound"); 
      Log.i("BUSINESS KEY IS: ", businessID); 

      firebaseAuth = FirebaseAuth.getInstance(); 
      mDatabase = FirebaseDatabase.getInstance().getReference(); 

      resNameChange = rootView.findViewById(R.id.resNameChange); 
      statusChange = rootView.findViewById(R.id.statusChange); 

      mDatabase.addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        showData(dataSnapshot); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 

      return rootView; 
     } 

     public void showData(DataSnapshot dataSnapshot) { 

      if (dataSnapshot.child("business_info").child(businessID).exists()) { 
       for (DataSnapshot ds : dataSnapshot.getChildren()) { 
        RestaurantInformation resInfo = new RestaurantInformation(); 
//error on the line below****** 
        resInfo.setResName(ds.child(businessID).getValue(RestaurantInformation.class).getResName()); 
        resInfo.setStatus(ds.child(businessID).getValue(RestaurantInformation.class).getStatus()); 

        resNameChange.setText(resInfo.getResName()); 
        statusChange.setText(resInfo.getStatus()); 
       } 
      } else { 
       resNameChange.setText("NAME"); 
       statusChange.setText("ONLINE"); 
      } 

     } 

    } 

我的模型

public class RestaurantInformation { 

    private String resName; 
    private String status; 

    public RestaurantInformation() { 

    } 

    public RestaurantInformation(String resName) { 
     this.resName = resName; 
    } 

    public RestaurantInformation(String resName, String status) { 
     this.resName = resName; 
     this.status = status; 
    } 

    public String getResName() { 
     return resName; 
    } 

    public void setResName(String resName) { 
     this.resName = resName; 
    } 

    public String getStatus() { 
     return status; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 
} 
+0

I /業務鍵:: PjSxhQXCyXdSv07LxVzU7buvhkF2 – ben

回答

1

您當前的代碼被下載整個數據庫,然後試圖弄清楚如何顯示的客戶端。這對用戶帶寬的使用非常浪費。我建議只監聽業務,你有興趣:

mDatabase = FirebaseDatabase.getInstance().getReference(); 
mDatabase.child("business_info").child(businessID).addValueEventListener(new ValueEventListener() { 

然後你就可以簡化您的showData方法:

public void showData(DataSnapshot snapshot) { 

    if (snapshot.exists()) { 
     RestaurantInformation resInfo = snapshot.getValue(RestaurantInformation.class) 

     resNameChange.setText(resInfo.getResName()); 
     statusChange.setText(resInfo.getStatus()); 
    } else { 
     resNameChange.setText("NAME"); 
     statusChange.setText("ONLINE"); 
    } 

} 
+0

非常有幫助!謝謝! – ben

相關問題