我在我的应用中使用FirebaseUI
,FirebaseRecyclerAdapter
更具体。
我正在使用给定here的方法从我的FirebaseDatabase
引用中获取数据。
这是我的代码:
private void attachRecyclerViewAdapter() {
Query lastFifty = mDatabase.child(rID).limitToFirst(50);
mRecyclerViewAdapter = new FirebaseRecyclerAdapter<AModelClass, AModelClass.ViewHolder>(
AModelClass.class, R.layout.a_player_layout, APlayersModelClass.ViewHolder.class, lastFifty) {
@Override
protected void populateViewHolder(AModelClass.ViewHolder viewHolder, AsModelClass model, int position) {
String key = this.getRef(position).getKey();
aReference.child(requestID).child(key).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
Map<String, String> map = (Map<String, String>) dataSnapshot.getValue();
pA = map.get("pName");
uA = map.get("pUrl");
// error on line below
String cLatS = map.get("cLat").trim();
currentLtAU = Double.parseDouble(cLatS);
String cLngS = map.get("cLng").trim();
currentLnAU = Double.parseDouble(cLngS);
viewHolder.setPName(pA);
viewHolder.setPUrl(uA);
viewHolder.setCurrentLatAU(String.valueOf(currentLtAU));
viewHolder.setCurrentLngAU(String.valueOf(currentLnAU));
} else {
Snackbar snackbar = Snackbar
.make(coordinatorLayout, "Some error occurred. Please retry!", Snackbar.LENGTH_SHORT);
snackbar.show();
onBackPressed();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
};
aList.setAdapter(mRecyclerViewAdapter);
}
以下是数据库结构的样子:
-app
-requestID
-uniqueKey1
-key: value
-key: value
-cLat: value
-uniqueKey2
-key: value
-key: value
-cLat: value
正如您在上面的数据库结构中所看到的,引用有2 keys
,所有数据都被提取并显示在RecyclerView
中,但只要从引用中删除了一个键,应用程序崩溃,在上面指定的行上发出此错误:java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.trim()' on a null object reference
。
引用仍有一个key
,我正在获取的所有相同字段也在这一个键中。然后为什么我收到此错误?
答案 0 :(得分:0)
如果这导致错误:
Map<String, String> map = (Map<String, String>) dataSnapshot.getValue();
String cLatS = map.get("cLat").trim();
原因很可能是快照没有子cLat
。
您应该查看.hasChild("cLat")
- 请参阅DataSnapshot
...或阻止尝试的.trim(null)
:
if(map.get("cLat") != null) {
String cLatS = map.get("cLat").trim();
currentLtAU = Double.parseDouble(cLatS);
}
对于此类应用,您可能需要查看Firebase GeoFire。