使用用户名参考将数据保存到Firebase

时间:2018-02-04 15:12:06

标签: java android firebase firebase-realtime-database

我正在开发一个测验应用程序,用户可以通过该测验进行测验,在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,所以任何帮助/链接都受到赞赏。

enter image description here

3 个答案:

答案 0 :(得分:0)

你可以做这样的事情

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

答案 1 :(得分:0)

将您的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);

让我知道它是否有效。

答案 2 :(得分:0)

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

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

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