【问题标题】:Saving data to Firebase with a Username Reference使用用户名参考将数据保存到 Firebase
【发布时间】:2018-02-05 16:22:04
【问题描述】:

我正在开发一个测验应用程序,用户通过该应用程序进行测验,并在 10 个问题后将分数保存到 Firebase 中的数据库中。

这是我目前的代码:

String user_id = mAuth.getCurrentUser().getUid();

        DatabaseReference current_user_db = 
FirebaseDatabase.getInstance().getReference().child("Score").child(user_id);

        final int score = mScore;

        **databaseUserName = FirebaseDatabase.getInstance().getReference().child("Users").child(user_id).child("username");
        databaseUserName.addValueEventListener(new com.google.firebase.database.ValueEventListener() {
            @Override
            public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) {
                String username = dataSnapshot.getValue().toString();
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });**


        //Ensures everything saves at the same time
        Map newPost = new HashMap();
        newPost.put("Score", score);
        **newPost.put("Username", username);**

        current_user_db.setValue(newPost);

** ** 中包含的部分是我遇到一些困难的地方。

用户使用 FirebaseAuth 注册我的应用,然后使用我在“用户”实时数据库中存储的名称和用户名的 UID。

我希望分数数据库使用用户名而不是自动生成的 UID 保存最终分数。我只是不确定如何获取用户名,然后将其保存到新数据库中。

我还附上了我当前数据库外观的屏幕截图。

我只使用 Firebase 和 Android Studio 几个星期,所以任何帮助/链接都非常感谢。

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    你可以这样做

        final String userName = "userX";
        final int score = 55;
        FirebaseDatabase db = FirebaseDatabase.getInstance();
        db.getReference("Score").child(userName).child("Score").setValue(score).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Log.d(TAG, "onSuccess: updated " + userName + "'s score (" + score + ")");
            }
        });
    

    【讨论】:

    • 这不是引用存储在数据库中的当前用户用户名吗?
    • 你用String username = dataSnapshot.getValue().toString();这一行检索到了当前用户名,对吧?
    • 我就是这样尝试的,但是当我尝试将变量用户名添加到新数据库时,我不断收到错误
    • 只是为了确保我做对了,您从数据库中检索到的那个 userName 是您想要用作得分值的键的那个,对吧?
    • 原来是这样,但后来我意识到你不能重复键,所以现在我实现了推送功能,将分配一个随机键。如果有意义的话,我希望将用户名和分数保存在该键中。 UID 和用户名是不同的值。
    【解决方案2】:

    将您的String userName 更改为会员。

     String user_id = mAuth.getCurrentUser().getUid();
    
       // you can remove child(user_id) if you want to put username directly under Score
       DatabaseReference current_user_db = FirebaseDatabase.getInstance().getReference().child("Score").child(user_id); 
    
       final int score = mScore;
    
       DatabaseReference databaseUserName = FirebaseDatabase.getInstance().getReference().child("Users").child(user_id).child("username");
      databaseUserName.addValueEventListener(new ValueEventListener() {
           @Override
           public void onDataChange(DataSnapshot dataSnapshot) {
               userName = dataSnapshot.getValue().toString();
           }
    
           @Override
           public void onCancelled(DatabaseError databaseError) {
    
           }
       });
    
       //Ensures everything saves at the same time
       Map newPost = new HashMap();
       newPost.put("Score", score);
       newPost.put("Username", username); // I don't think you need this.
    
       current_user_db.child(username).setValue(newPost);
    

    让我知道它是否有效。

    【讨论】:

      【解决方案3】:

      您无法在onDataChange() 方法之外简单地使用username,因为此方法具有异步行为,这意味着即使在您尝试从数据库中获取数据之前也会调用它。快速解决您的问题是移动以下代码行:

      Map newPost = new HashMap();
      newPost.put("Score", score);
      newPost.put("Username", username);
      current_user_db.child(username).setValue(newPost);
      

      onDataChange() 方法中,您的问题将得到解决,但如果您需要在onDataChange() 方法之外使用username 的值,那么您需要创建自己的回调,为此我建议您查看最后一个我对此post的部分回答。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-03
        • 1970-01-01
        • 2019-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多