从 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 数据库中的 autoID 获取价值 - Swift