Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从Firebase数据库获取值_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 从Firebase数据库获取值

Android 从Firebase数据库获取值,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我需要从Firebase数据库中的节点密码中获取字符串值,以便与用户输入进行比较,但不幸的是,我无法获取该值。这是下图中我的firebase数据库的链接 以下是我的代码: final DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("pin_code"); mDatabase.addListenerForSingleValueEvent(new com.google.fire

我需要从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"
     }
  }
尝试更改此选项:

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

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

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("")){
    
    使用以下命令:

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

    当我添加以下错误时,java.lang.NullPointerException:如果(rface.equals(userPassword)&&&!rface.equals(“”),则尝试在此行的空对象引用上调用虚拟方法“boolean java.lang.String.equals(java.lang.Object)”)我用你的建议编辑了我的代码,但现在它什么也不返回给我。我在最初的代码片段中犯了一个错误。我刚刚解决了这个问题,看看这是否解决了您现在的问题。我使用了第二种方法,它不返回任何值这是代码。DatabaseReference user=FirebaseDatabase.getInstance().getReference(“pin_代码”).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(“”){//do something}}我收到以下错误java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“boolean java.lang.String.equals(java.lang.Object)”