从 Firebase 数据库中获取价值

Posted

技术标签:

【中文标题】从 Firebase 数据库中获取价值【英文标题】:Get Value from Firebase Database 【发布时间】:2017-08-02 13:54:05 【问题描述】:

我需要从我的 Firebase 数据库中的节点密码中获取字符串值以与用户输入进行比较,但不幸的是我无法获取该值。这是下图中我的 firebase 数据库的链接。

这是我下面的代码:

 final DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("pin_code");

        mDatabase.addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() 
            @Override
            public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) 
                String rface = (String) dataSnapshot.child("pincode").getValue();
                if (rface.equals(userPassword) && !rface.equals(""))
                    Intent intent = new Intent(PinActivity.this, ProfileActivity.class);
                    startActivity(intent);
                
                else 
                    if (rface.equals("") || rface.equals(null))
                        // Creating new user node, which returns the unique key value
                        // new user node would be /users/$userid/
                        String userId = mDatabase.push().getKey();

                        // creating user object
                        Pin pin = new Pin(authUserId, userPassword);

                        mDatabase.child(userId).setValue(pin);

                        Intent intent = new Intent(PinActivity.this, ProfileActivity.class);
                        startActivity(intent);
                    
                    else 
                        Toast.makeText(PinActivity.this,"Invalid PIN code", Toast.LENGTH_SHORT).show();
                        return;
                    

                
            

            @Override
            public void onCancelled(DatabaseError databaseError) 
            
        );

这是json代码

  
  "pin_code" : 
"id" : "TQYTo1NHNnhPJnOxhe1Vok3U6ic2",
"pincode" : "12345"
     
  

【问题讨论】:

【参考方案1】:

这个FirebaseDatabase.getInstance().getReference("pin_code") 不是指您要查找的节点。您很可能知道 id 属性,在这种情况下,您可以通过以下方式获取节点:

DatabaseReference collection = FirebaseDatabase.getInstance().getReference("p...");
Query query = collection.orderByChild("id").equalTo("TQT...ic2");

query.addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() 
    @Override
    public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) 
      for (DataSnapshot child: dataSnapshot.getChildren()) 
        String rface = (String) child.child("pincode").getValue();
        if (rface.equals(userPassword) && !rface.equals(""))

我所做的更改:

    在第一行,我们得到集合:您要在其下运行查询的节点。您在屏幕截图中删除了该节点的名称,但这是您标记的第二行。 在第二行中,我们对集合下每个子节点的id 属性创建一个查询。 在onDataChange 中我们添加了一个循环。这是必需的,因为针对 Firebase 数据库的查询可能会产生多个结果。所以dataSnapshot 包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。我们循环 dataSnapshot.getChildren() 来处理这多个结果。

如果只有一个节点具有相同的id,则应考虑更改数据结构以使用id 作为节点的键。所以:

pin_codes
  uid1: "pincode1"
  uid2: "pincode2"

您的代码会变得非常简单,因为您不再需要查询用户。您可以直接从路径中读取:

DatabaseReference user = FirebaseDatabase.getInstance().getReference("pin_codes").child("TQT...ic2");

user.addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() 
    @Override
    public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) 
        String rface = (String) dataSnapshot.getValue();
        if (rface.equals(userPassword) && !rface.equals(""))

【讨论】:

我根据您的建议编辑了我的代码,但现在它对我没有任何回报。 我最初的 sn-p 有一个错误。我刚刚解决了这个问题,所以看看这是否解决了您现在遇到的问题。 我使用了第二种方法,它没有返回任何值 这是代码。 DatabaseReference user = FirebaseDatabase.getInstance().getReference("pin_code").child("TQYTo1NHNnhPJnOxhe1Vok3U6ic2"); user.addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() @Override public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) String rface = (String) dataSnapshot.getValue(); if (rface .equals(userPassword) && !rface.equals("")) //做点什么 我收到此错误 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on an null object reference【参考方案2】:

尝试改变这个:

String rface = (String) dataSnapshot.child("pincode").getValue();

到这里:

String rface = (String) dataSnapshot.child("pincode").getValue(String.class);

【讨论】:

当我补充说我有这个错误 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on an null object reference on这一行 if (rface.equals(userPassword) && !rface.equals(""))【参考方案3】:

使用以下::

Object some = dataSnapshot.getValue();
String value = some.toString();

【讨论】:

以上是关于从 Firebase 数据库中获取价值的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 从数据库中获取价值

如何从 Firebase 数据库中的 autoID 获取价值 - Swift

无法从Firebase获取价值

如何从 Xamarin 中的 Firebase 获取价值?

如何从 Firebase android kotlin 获取所有具有特定价值的孩子?

Firebase 实时数据库使快照更有价值