【问题标题】:Unable to retrieve data from firebase by retrieve "number"无法通过检索“数字”从 Firebase 检索数据
【发布时间】:2019-09-25 12:42:22
【问题描述】:

我是新手,正在学习如何使用 android studio 和 firebase 实时存储来创建应用程序。我试图制作一个可以轻松从 firebase 检索详细信息的应用程序,当尝试从 firebase 检索详细信息时,应用程序会自行停止。通过这种布局: enter image description here

    a=(TextView)findViewById(R.id.account);
    b=(TextView)findViewById(R.id.name);
    c=(TextView)findViewById(R.id.bank);
    edt=(EditText)findViewById(R.id.enteracc);
    btn=(Button)findViewById(R.id.search);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            reff= FirebaseDatabase.getInstance().getReference();
            reff.child("number").addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    String enternum=dataSnapshot.child("number").getValue().toString();
                    String account=dataSnapshot.child("account").getValue().toString();
                    String name=dataSnapshot.child("name").getValue().toString();
                    String bank=dataSnapshot.child("bank").getValue().toString();
                    a.setText(account);
                    b.setText(name);
                    c.setText(bank);
                    edt.setText(enternum);
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

使用 setOnClickListener 按钮的正确方法是什么?

在 Firebase 中,数据将如下所示:

number:
{
  "22508800018589":
  {
    "account": "22508800018589",
    "name": "CBS TOP TRADING",
    "bank": "rhb"
  },
  "11004600239812":
  {
    "account": "11004600239812",
    "name": "Kong Kit Lun",
    "bank": "rhb"
  },
  "11407100284908":
  {
    "account": "11407100284908",
    "name": "Tee Wan Yee",
    "bank": "rhb"
  }
}

【问题讨论】:

  • “应用程序在尝试从 firebase 检索详细信息时自行停止” - 请添加您的错误日志

标签: android firebase firebase-realtime-database


【解决方案1】:

您的子节点没有number 属性,因此不会获得任何值:

String enternum=dataSnapshot.child("number").getValue().toString();

事实上,getValue() 将返回null,因此调用toString() 将抛出NullPointerException

我的猜测是您正在寻找作为节点键的数字。您可以通过以下方式获得:

String enternum = dataSnapshot.getKey();

正如 André 所说,您还需要遍历 number 下的子节点。结合起来就变成了:

reff= FirebaseDatabase.getInstance().getReference();
reff.child("number").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
      for (DataSnapshot dataSnapshot: snapshot.getChildren()) {
        String enternum=dataSnapshot.getKey();
        String account=dataSnapshot.child("account").getValue(String.class);
        String name=dataSnapshot.child("name").getValue(String.class);
        String bank=dataSnapshot.child("bank").getValue(String.class);
        a.setText(account);
        b.setText(name);
        c.setText(bank);
        edt.setText(enternum);
      }
    }

【讨论】:

  • 他们不应该循环遍历 ondatachange 中的结果吗?
  • 好一个安德烈。
  • 经过一些更改后,应用程序可以正常工作并且不会自行停止,但是当搜索数字“11004600239812”或“11407100284908”时,它会显示“22508800018589”的详细信息。无论搜索什么数字,这些应用将在 firebase 中显示最大的数字。
  • 我尝试了几次,无论我搜索什么数字,它只会显示应用程序中最大的数字。那是我错过了一些步骤吗?还是问题发生在 json 文件中?
  • 这似乎是一个新问题,因为这个问题与搜索无关。但我最初的猜测是,您看到的结果是您尝试搜索数字,但将数据存储为字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
相关资源
最近更新 更多