【问题标题】:Firebase retriving single text data and setting it in a textviewFirebase 检索单个文本数据并将其设置在文本视图中
【发布时间】:2018-03-17 21:10:41
【问题描述】:

我一直在尝试仅检索保存在 firebase 中的用户名数据并将其显示在导航抽屉的文本视图中,但我要么不断收到错误和应用程序崩溃,要么在文本视图中没有显示任何内容并且应用程序不会崩溃.此代码不会导致应用崩溃。

这是我的数据库

数据模型

public class users {
    private String userID;
    private String userEmail;
    private String userName;
    private String userUsername;


    public users() {

    }

    public users(String userID, String userEmail, String userName, String userUsername) {
        this.userID = userID;
        this.userEmail = userEmail;
        this.userName = userName;
        this.userUsername = userUsername;
    }

    public String getUserID() {
        return userID;
    }

    public String getUserEmail() {
        return userEmail;
    }

    public String getUserName() {
        return userName;
    }

    public String getUserUsername() {
        return userUsername;
    }

    public void setUserID(String userID) {
        this.userID = userID;
    }

    public void setUserEmail(String userEmail) {
        this.userEmail = userEmail;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setUserUsername(String userUsername) {
        this.userUsername = userUsername;
    }
}

主要活动

//ASSIGNING FIREBASE OBJECTS.
mAuth = FirebaseAuth.getInstance();
mFire = FirebaseDatabase.getInstance();
user = mAuth.getCurrentUser();
userID = user.getUid();

mDatabase = mFire.getReference("users");
usernameRef = mDatabase.child(userID);


//METHODS
checkIfUserSignedIN();
InitImgLoader();
setProfileImg();



//NAVIGATION LAYOUT.
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);



//HEADER VIEW LAYOUT.
username = findViewById(R.id.Username_onDrawer);
View headView = navigationView.getHeaderView(0);
ImageView pp = headView.findViewById(R.id.profile_image);
pp.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        Intent i = new Intent(MainActivity.this, ProfileActivity.class);
        startActivity(i);
    }
});

usernameRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {


       for (DataSnapshot ds : dataSnapshot.child("userUsername").getChildren()){
            users usernamE = new users();
            usernamE.setUserUsername(ds.child(userID).getValue(users.class).getUserUsername());


            username.setText(usernamE.getUserUsername());
        }

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

I'm trying to set username below this image view

**更新!***强文本***** 只有当我使用以下代码拥有这样的数据库时,它似乎才有效..

 mDatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {


                String UserUserName = String.valueOf(dataSnapshot.child("userUsername").getValue());


                username.setText(UserUserName);

            }

database with No user id

这就是我将数据保存到 firebase 的方式

 //USER SIGNUP INFORMATION METHOD.
private void push(){

    String Email = email.getText().toString().trim();
    String Name = name.getText().toString().trim();
    String Username = userName.getText().toString().trim();

    String id = mDatabase.push().getKey();

    users Users = new users(id, Email, Name, Username);

    mDatabase.child(id).setValue(Users);

【问题讨论】:

  • 你已经在usernameRef上添加了监听器,它指向/users/<userId>,所以你应该只使用usernamE = dataSnapshot.getValue(users.class)。如果您只需要userUsername,请将侦听器添加到/users/<userId>/userUsername
  • 仍然导致崩溃:(

标签: android database firebase firebase-realtime-database textview


【解决方案1】:

如果我是你,我使用uid 作为唯一标识,而不是push() 方法生成的推送键。为此,请更改以下代码行:

String id = mDatabase.push().getKey();
users Users = new users(id, Email, Name, Username);
mDatabase.child(id).setValue(Users);

与:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
users Users = new users(uid, Email, Name, Username);
mDatabase.child(uid).setValue(Users);

要从数据库中获取数据,请使用 String 类使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("users").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String userEmail = dataSnapshot.child("userEmail").getValue(String.class);
        String userID = dataSnapshot.child("userID").getValue(String.class);
        String userName = dataSnapshot.child("userName").getValue(String.class);
        String userUsername = dataSnapshot.child("userUsername").getValue(String.class);
        Log.d("TAG", userEmail + " / " + userID + " / " + userName + " / " + userUsername);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

如果要使用模型类,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("users").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        users u = dataSnapshot.getValue(users.class);
        String userEmail = u.getUserEmail();
        String userID = u.getUserID();
        String userName = u.getUserName();
        String userUsername = u.getUserUsername();
        Log.d("TAG", userEmail + " / " + userID + " / " + userName + " / " + userUsername);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

在这两种情况下,删除您的所有数据并添加新数据。

【讨论】:

  • 这就是答案! ??? 非常感谢楼主!
【解决方案2】:

如果您正在获取用户名,您可以这样做:

usernameRef = mDatabase.child(userID);
usernameRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {

        String names=dataSnapshot.child("userUsername").getValue().toString();
        username.setText(names);


}

快照将是userid,然后您不需要迭代,只需访问它,因为它是直接子代。

【讨论】:

  • 这种方式仍然会导致应用崩溃。我在这篇文章中添加了更新。我认为这可能与firebase push() 函数有关......?还是谢谢
  • @user8360723 不检查编辑现在它会起作用,我在这里写的是child("username")而不是child("userUsername")
  • yeaa 注意到大声笑我有很多“用户”名称变量......无论如何它仍然会导致应用程序崩溃。只有当我的数据库中没有用户 ID 键时它才有效
  • 可能没有当前用户
猜你喜欢
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 2022-01-11
  • 2014-10-17
  • 1970-01-01
相关资源
最近更新 更多