【发布时间】:2017-11-27 22:11:01
【问题描述】:
我有一个没有意义的错误(至少对我而言)。 在我的应用程序中,用户可以出售东西。所以我将他们想要出售的东西存储在 firebase 数据库中。这就是我的应用程序将数据写入 Firebase 的方式:
“Items”类构造函数(Getters / Setters 和 String 变量也在那里):
public Items (String title, String info, String photoItem, String userid){
this.id = userid;
this.title = title;
this.info = info;
this.photoItem = photoItem;
}
当用户创建新项目时,将运行以下代码:
if(!TextUtils.isEmpty(titleInfo) || !TextUtils.isEmpty(infoInfo)) {
String id = databaseItems.push().getKey();
Items items = new Items(titleInfo, infoInfo, imageEncoded, user.getUid());
//Trenger fiks:
databaseItems.child(id).setValue(items, new DatabaseReference.CompletionListener() {
public void onComplete(DatabaseError error, DatabaseReference ref) {
if(error == null) {
Toast.makeText(NewItemsActivity.this, "Item Added!", Toast.LENGTH_SHORT).show();
startActivity(new Intent(NewItemsActivity.this, ProfileActivity.class));
}
else {
Log.d("Status:", "No databaseconnection");
Toast.makeText(NewItemsActivity.this, "Error: Something went wrong", Toast.LENGTH_SHORT).show();
}
}
});
}
当用户创建了一个新项目后,数据库中的数据将如下所示:
"Items": {
"Some key": {
"Id": "The user ID",
"title": "Some title",
"photoitem": "Some string",
"info": "Some info"
}
上面的一切都完美无缺,我还检索了数据并将其放入recyclerview。
问题是: 我想对 Id 做一些事情(这是 firebase 用户 ID(.getUid()), 但由于某种原因,它返回 null。
如果我让自己不清楚,正确的 user.getUid() 被保存到数据库中,问题是检索它。
这是我获取数据的地方:
private void prepareItemData() {
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference dbref = database.getReference();
dbref.child("Items").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d(TAG, "in onChildAdded");
if(dataSnapshot.exists()) {
Log.d(TAG, "In postSnapshot");
data.clear();
for(DataSnapshot ds: dataSnapshot.getChildren()) {
Items item = ds.getValue(Items.class);
data.add(new Items(item.getTitle(), item.getInfo(), item.getPhotoItem(), item.getId()));
Log.d(TAG, item.toString());
Log.d(TAG, item.getTitle());
Log.d(TAG, item.getInfo());
Log.d(TAG, item.getPhotoItem());
// Cant find Id!
// Log.d(TAG, item.getId());
// The app crashes when trying to log the item.getId()
}
iAdapter.notifyDataSetChanged();
}
}
@Override
public void onCancelled(DatabaseError firebaseError) {
}
});
}
我正在记录标题、信息和照片项,它们都会打印出字符串。 但如果我添加:Log.d(TAG, item.getId());,应用程序崩溃,并抛出 NullPointerException。
这里是错误:
FATAL EXCEPTION: main
Process: no.hiof.remir.smalltrades, PID: 23754
java.lang.NullPointerException: println needs a message
at android.util.Log.println_native(Native Method)
at android.util.Log.d(Log.java:168)
at no.hiof.remir.smalltrades.Activities.MainActivity$4.onDataChange(MainActivity.java:204)
at com.google.firebase.database.Query$1.onDataChange(Unknown Source)
at com.google.android.gms.internal.zzbmz.zza(Unknown Source)
at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source)
at com.google.android.gms.internal.zzboc$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
如果有人知道为什么会发生此错误,那将非常有帮助。这个问题让我头疼了一段时间。
【问题讨论】:
-
如果您是从 logicat 询问,那么该特定错误是由您尝试使用
null打印出消息引起的 -
不,该代码工作正常。错误发生在 Log.d(TAG, item.getId());只要我删除那个 Log.d,一切正常。不知道为什么 item.getId();返回 null,当我可以看到它保存在数据库中时。
-
如果导致问题,则删除该行代码或使用它打印值,例如
Log.d(TAG, String.valueOf(item.getId());,您将不会得到NullPointerException -
好的,你的建议似乎奏效了!谢谢!请问有什么区别: Log.d(TAG, item.getId());和 Log.d(TAG, String.valueOf(item.getId())); item.getId 什么时候是字符串?
-
Log不能直接打印空消息,String可以采用空值。但是你可以打印出valueOf,如果它为空,Log只会在你的 logcat 中打印出null。
标签: java android firebase firebase-realtime-database