【问题标题】:Firebase datasnapshot getValue() does not find specific data in the databaseFirebase datasnapshot getValue() 未在数据库中找到特定数据
【发布时间】: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


【解决方案1】:

您为Items 类定义字段和getter/setter 的方式可能存在问题。不能肯定地说,因为您没有发布Items 的完整代码。或者可能是您的数据库中有一些旧值是从以前版本的 Items 创建的。

在您发布的数据库 sn-p 中,用户 ID 字段是大写的,IdgetId() 正在寻找小写的 id 并将返回 null,因为该字段不存在。

Items 的构造函数有this.id,这表明当前版本的Items 使用idgetId()setId(),它们是一致的并且可以工作。数据库中的Id 值可能是旧的。您需要浏览数据库并将Id 的所有实例更改为id

【讨论】:

  • 是的,Yupi 已经帮我解决了这个问题。我认为Id(大写的“I”)可能是问题所在,但事实并非如此。通过更改 item.getId(); 解决与 String.valueOf(item.getId());仍然不知道为什么 item.getId() 返回 null,而另一个不知道,但知道它有效。谢谢你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多