【问题标题】:Why my Firebase Realtime Database is only saving 1 user [closed]为什么我的 Firebase 实时数据库只保存 1 个用户 [关闭]
【发布时间】:2018-11-27 04:51:30
【问题描述】:

为什么我的实时数据库没有添加新数据,而只是替换了新数据。一定是添加而不是替换。

这是我添加新用户的代码:

public void addNewUser(String email, String username, String bio, String website, String interests, String address, String profile_photo){

    User user = new User(userID,1 , email, address, StringManipulation.condenseUsername(username));

    myRef.child(mContext.getString(R.string.dbname_users))
            .child(userID)
            .setValue(user);

    UserAccountSettings settings = new UserAccountSettings(
            interests,
            username,
            0,
            0,
            0,
            "",
            username,
            website,
            bio
    );

    myRef.child(mContext.getString(R.string.dbname_user_account_settings))
            .child(userID)
            .setValue(settings);
}

User 类:

public class User {

private String user_id;
private long phone_number;
private String email;
private String address;
private String username;

public User(String user_id, long phone_number, String email, String address, String username) {
    this.user_id = user_id;
    this.phone_number = phone_number;
    this.email = email;
    this.address = address;
    this.username = username;
}

public User() {

}

public String getUser_id() {
    return user_id;
}

public void setUser_id(String user_id) {
    this.user_id = user_id;
}

public long getPhone_number() {
    return phone_number;
}

public void setPhone_number(long phone_number) {
    this.phone_number = phone_number;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

@Override
public String toString() {
    return "User{" +
            "user_id='" + user_id + '\'' +
            ", phone_number=" + phone_number +
            ", email='" + email + '\'' +
            ", address='" + address + '\'' +
            ", username='" + username + '\'' +
            '}';
}

UserAccountSettings 类:

public class UserAccountSettings {

private String interests;
private String display_name;
private long followers;
private long truefans;
private long trustworthy;
private String profile_photo;
private String username;
private String website;
private String bio;

public UserAccountSettings(String interests, String display_name, long followers, long truefans, long trustworthy, String profile_photo, String username, String website, String bio) {
    this.interests = interests;
    this.display_name = display_name;
    this.followers = followers;
    this.truefans = truefans;
    this.trustworthy = trustworthy;
    this.profile_photo = profile_photo;
    this.username = username;
    this.website = website;
    this.bio = bio;
}

public UserAccountSettings() {

}

public String getInterests() {
    return interests;
}

public void setInterests(String interests) {
    this.interests = interests;
}

public String getDisplay_name() {
    return display_name;
}

public void setDisplay_name(String display_name) {
    this.display_name = display_name;
}

public long getFollowers() {
    return followers;
}

public void setFollowers(long followers) {
    this.followers = followers;
}

public long getTruefans() {
    return truefans;
}

public void setTruefans(long truefans) {
    this.truefans = truefans;
}

public long getTrustworthy() {
    return trustworthy;
}

public void setTrustworthy(long trustworthy) {
    this.trustworthy = trustworthy;
}

public String getProfile_photo() {
    return profile_photo;
}

public void setProfile_photo(String profile_photo) {
    this.profile_photo = profile_photo;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getWebsite() {
    return website;
}

public void setWebsite(String website) {
    this.website = website;
}

public String getBio() {
    return bio;
}

public void setBio(String bio) {
    this.bio = bio;
}

@Override
public String toString() {
    return "UserAccountSettings{" +
            "interests='" + interests + '\'' +
            ", display_name='" + display_name + '\'' +
            ", followers=" + followers +
            ", truefans=" + truefans +
            ", trustworthy=" + trustworthy +
            ", profile_photo='" + profile_photo + '\'' +
            ", username='" + username + '\'' +
            ", website='" + website + '\'' +
            ", bio='" + bio + '\'' +
            '}';
}

这就是我调用firebaseMethod.addNewUser的方法的地方:

 mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();

            if (user != null) {
                // User is signed in
                Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());

                myRef.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        // 1st check: Make sure the username is not already in use
                        if (firebaseMethods.checkIfUsernameExists(username, dataSnapshot)){
                            append = myRef.push().getKey().substring(3,10);
                            Log.d(TAG, "onDataChange: username already exists. Appending random string to name: " + append);
                        }

                        username = username + append;

                        // add new user to the database

                        firebaseMethods.addNewUser(email,username,"","","","","");

                        Toast.makeText(mContext, "Signup successful. Sending verification email.", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });

                finish();

            } else {
                // User is signed out
                Log.d(TAG, "onAuthStateChanged:signed_out");
            }
            // ...
        }
    };

这是我的mAauth.signOutin HomeActivity.class

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    Log.d(TAG, "onCreate: starting.");

    setupFirebaseAuth();

    initImageLoader();
    setupBottomNavigationView();
    setupViewPager();

    FirebaseAuth.getInstance().signOut();


}

经过身份验证的用户的图像: enter image description here

数据库图像: enter image description here

很抱歉没有发布图片,只是没有足够的代表。谢谢

【问题讨论】:

  • 看起来您正在覆盖数据库中的数据或类似的东西。您可能需要添加一些代码来显示如何将用户保存在数据库中。
  • 不,您可以添加多个用户或在 firebase 中显示他们的功能。您可能在将用户 ID 添加到 firebase 时做错了,这将在您添加代码 sn-p 后澄清
  • 我刚刚添加了代码。谢谢!
  • addNewUser函数中userID从哪里来?此外,如果您专注于一个部分,例如只添加用户并忽略(至少从此处删除)accountsettings 部分,它会更清楚。

标签: android database firebase authentication


【解决方案1】:

Firebase 允许将多个用户的信息存储在 firebase 实时数据库中,但只能作为经过身份验证的用户。我认为您尚未从第一个用户注销。这就是为什么它只保存一个用户。您是否创建了一个退出按钮并执行过类似的操作:

FirebaseAuth mAuth = FirebaseAuth.getInstance();
mAuth.signOut();

【讨论】:

  • 是的,我做到了。我只是改进我的问题。请检查我的代码,谢谢!
  • 您的注销方法在哪里。我没看到?发布完整的代码,仅使用您显示的代码块很难理解。
  • 如果你已经在github上传代码,请提供github链接
  • 我还没有登出方法,但是我添加了登出的代码。
  • 实现注销方法。您必须在输入详细信息之前对用户进行身份验证,因为您使用用户的 authID 来存储数据。如果您已添加它,请向我们展示代码。提供完整的代码,而不是半成品代码。
猜你喜欢
  • 2021-06-10
  • 1970-01-01
  • 2018-08-03
  • 2014-02-27
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2023-03-16
  • 2020-06-14
相关资源
最近更新 更多