【问题标题】:Adding Data in the Realtime Database but it adding in the wrong child在实时数据库中添加数据,但添加了错误的子项
【发布时间】:2018-06-19 10:00:43
【问题描述】:

我正在尝试在userId 下添加新的用户数据,但它正在将旧数据替换为新数据并添加另一个“用户”和“用户帐户设置”。

这是我的实时数据库: enter image description here

我的实时数据库必须是这样的:添加一个新的用户数据而不将旧数据替换为新数据,也不添加“用户”和“用户帐户设置”。

这是我想要的数据库结构示例:enter image description here

这是添加新用户的代码:

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)
            .child("users")
            .push()
            .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)
            .child("user_account_settings")
            .push()
            .setValue(settings);
}

这是我从RegisterActivity.class 调用firebaseMethods.addNewUser 的代码:

 private void setupFirebaseAuth(){
    Log.d(TAG, "setupFirebaseAuth: setting up firebase auth.");

    mAuth = FirebaseAuth.getInstance();
    firebaseDatabase = FirebaseDatabase.getInstance();
    myRef = FirebaseDatabase.getInstance().getReference();

    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");
            }
            // ...
        }
    };

这是我现在的数据结构,Frank van Puffelen: enter image description here

【问题讨论】:

  • 这与your other question 有何不同? (除了添加第二个问题)
  • 我的另一个问题已经解决了,现在正在添加新的用户数据,但新用户数据的保存位置在“path,to,data”中,如您所见在顶部的图像中。一定是这样,新的用户数据必须位于userId下,不能替换其他数据。就像示例图片一样。
  • 如果您的其他问题已解决,那么为什么这里的第二种情况与其他问题中的问题完全相同?
  • 只是不完全一样。我将删除所有问题并添加新问题..

标签: java android firebase firebase-realtime-database


【解决方案1】:

如果您想在userid 下添加数据,请执行以下操作:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users").child("userid");

那么该位置将是userid,您添加的任何数据都将在它下面。

【讨论】:

  • 我应该在哪里添加,先生?我应该删除getReferencefromUrl 吗?
  • yes 删除 getReferenceFromUrl 并在答案中添加代码行而不是它。然后,当您想添加数据时,只需执行 ref.setValue("myData")ref.child("name").setValue("name_here");
  • 你的答案是什么意思?我想我应该在addNewUser 方法中这样做?
  • 而不是这个myRef = FirebaseDatabase.getInstance().getReferenceFromUrl("https://my-app-e37d8.firebaseio.com/path/to/data");使用DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users").child("userid");
  • 是的,我做到了。但是还是有点不对。我将在我的答案中添加我通过图片获得的结果..
【解决方案2】:

您在这些 sn-ps 中写入错误的位置:

.child(userID)
.child("users")
.push()

这导致路径/$uid/users/-L....,这不是您想要的。相反,您希望路径为 /users/$uid,这意味着您的代码需要与之匹配:

.child("users")
.child(userID)

这样你的addNewUser就变成了:

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);
}

【讨论】:

  • 我应用了您的答案,但仍然得到相同的结果,只是更改了“users”/“user_account_settings”和“userId”之间的位置。它还将旧数据替换为新数据。
  • 应用您的答案后,我现在添加了我的数据结构的图片。谢谢!
  • 如果我删除 .child("users") 和 .child("users_account_settings") 我将获得我想要的数据结构,但仍将旧数据替换为新数据。
  • 我更新了答案中的代码以删除重复的/users/users。该代码预计将替换用户的现有值。但是screenshot you posted 也只有每个用户的一组数据,所以我不确定你在寻找什么。
  • 我替换了我想要的结构基础的图片,它更具体。谢谢
【解决方案3】:

删除上面的这一行:

myRef = FirebaseDatabase.getInstance().getReferenceFromUrl("https://my-app-e37d8.firebaseio.com/path/to/data");

然后做类似的事情:

myRef.child("users").child(userId).setValue(YourClass.class);

输入您的班级名称而不是 YourClass

或者如果你只存储字符串,那么就这样做:

myRef.child("users").child(userId).setValue("Hello World");

【讨论】:

  • 我将在哪里添加?
  • 之后:userID = mAuth.getCurrentUser().getUid();
  • 如果我要补充一点,我有 2 节课,怎么办?
  • 2个班干什么用的??
  • “users”节点和“user_account_settings”节点
猜你喜欢
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多