【问题标题】:Firebase database DataSnapshot not workingFirebase 数据库 DataSnapshot 不起作用
【发布时间】:2018-06-27 13:19:04
【问题描述】:

我正在尝试根据登录用户的性别向他们显示欢迎信息。如果是“男性”,则为 setText("Hello Sir, your mail is: " + user.getEmail()),否则为 setText("Hello Madam, your mail is: " + user.getEmail())。这是我的数据库结构:

这是我正在处理的配置文件活动 java:

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.support.v7.app.AppCompatActivity;
import com.firebase.client.DataSnapshot;
import com.firebase.client.Firebase;
import com.firebase.client.FirebaseError;
import com.firebase.client.ValueEventListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

public class ProfileActivity extends AppCompatActivity {
    TextView textViewUserEmail;

    private FirebaseDatabase mFirebaseDatabase;
    private FirebaseAuth mAuth;
    public DatabaseReference myRef;
    public String userID;

    @Override
    protected void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        setContentView(R.layout.activity_profile);

        mAuth = FirebaseAuth.getInstance();
        Firebase.setAndroidContext(this);
        mFirebaseDatabase = FirebaseDatabase.getInstance();
        myRef = mFirebaseDatabase.getReference();
        final FirebaseUser user = mAuth.getCurrentUser();
        userID = user.getUid();
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("UsersMale");

        textViewUserEmail = (TextView) findViewById(R.id.textViewUserEmail);
        loadUserInformation();

        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String myStrign = dataSnapshot.getValue(String.class);
                if (user.isEmailVerified() && myStrign.equals("male")) {
                    textViewUserEmail.setText("Hello Sir, your mail is: " + user.getEmail());
                } else {
                    textViewUserEmail.setText("Hello Madam, your mail is: " + user.getEmail());
                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {}
        });
    }

}
}

代码返回错误。你能告诉我我在这里做错了什么吗?提前致谢。

【问题讨论】:

  • 发生这种情况是因为查询在您将其解析为字符串时返回了一个对象。 String myStrign = dataSnapshot.getValue(String.class);。您需要定义一个可以转换您返回的快照的 POJO。
  • 感谢您的回答。你能举一个答案的例子吗? @M.WaqasPervez
  • 此外,您的 Firebase 结构中没有任何节点具有密钥 Users
  • 你是不是假设了用户的性别?
  • 哦!是的,那是一个错误。 @M.WaqasPervez

标签: java android firebase firebase-realtime-database


【解决方案1】:

把数据库结构改成这样:

 users
   uniqueId
        name: superman
        gender: male
   uniqueId
        name: girl
        gender: female

不需要有两个父节点UserMaleUserFemale,只需创建一个节点,命名为users,每个用户都会有一个属性gender。

然后这样做:

FirebaseUser user = mAuth.getCurrentUser();
String userID = user.getUid();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users");

ref.child(userID).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            String gender=dataSnapshot.child("gender").getValue().toString();
            if(gender.equals("male")) {
                textViewUserEmail.setText("Hello Sir, your mail is: " + user.getEmail());
            } else {
                textViewUserEmail.setText("Hello Madam, your mail is: " + user.getEmail());
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {}
    });
}

首先检索用户ID,然后将位置放在users,然后附加一个侦听器并检索登录用户的性别值。

【讨论】:

  • 好的,我在导入 com.google.firebase.database.ValueEventListener 时遇到了问题,但在纠正之后,现在它显示 Class 'Anonymous class derived from ValueEventListener' must either be declared abstract or implement abstract method on 'onDataChange(DataSnapshot)' in 'ValueEventListener'。这可能是什么问题?
  • @Ashonko firebase.google.com/docs/reference/android/com/google/firebase/… ValueEventListener 是一个接口,当你实现一个接口时,你必须重写它的所有方法。只需让android studio自动完成它......当你编写新的ValueEventListener时,它应该自动编写该接口的方法......
猜你喜欢
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
相关资源
最近更新 更多