2016-09-16 57 views
3

我使用火力地堡数据库中的Android应用程序,并且每次用户是registred我存储在数据库中的一些值这个目的,我正在做的事情如下:写入新的数据

database = FirebaseDatabase.getInstance(); 
          DatabaseReference mRef = database.getReference().child("Users").push(); 
          FirebaseUser user = mAuth.getCurrentUser(); 
          String userId = user.getUid(); 
          mRef.child("User").child("age").setValue(selectedAge); 
          mRef.child("User").child("gender").setValue(finalGender); 
          mRef.child("User").child("userId").setValue(userId); 
          mRef.child("User").child("username").setValue(username); 

但当我进入我的Firebase控制台时,我看到一种id是自动生成的,我不需要,因为您可以在图像中看到我设置了自己的id。

enter image description here

有没有办法避免这种情况,以及类似的图像中的第二用户节点创建节点?

:所述第二用户节点i添加它manualy

回答

2

要直接在这里回答你的问题是我建议的变化:

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
FirebaseUser user = mAuth.getCurrentUser(); 
String userId = user.getUid(); 
DatabaseReference mRef = database.getReference().child("Users").child(userId); 
mRef.child("age").setValue(selectedAge); 
mRef.child("gender").setValue(finalGender); 
mRef.child("username").setValue(username); 

我还建议你创建一个Java类来表示要在数据库中存储任何用户数据。利用Firebase使用Java类读取/写入数据库的能力将使这些操作变得更加简单。例如您添加User类项目如下所示:

public class User { 

    public double age; 
    public String gender; 
    public String userName; 

    //required default constructor 
    public User() { 
    } 

    public User(double age, String gender, String userName) { 
     this.age = age; 
     this.gender = gender; 
     this.userName = userName; 
    } 

    public double getAge() { 
     return age; 
    } 

    public void setAge(double age) { 
     this.age = age; 
    } 

    public String getGender() { 
     return gender; 
    } 

    public void setGender(String gender) { 
     this.gender = gender; 
    } 

    public String getUserName() { 
     return userName; 
    } 

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

通过使用Java类写信给你的数据库,你可以像这样更新您的写操作:

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
FirebaseUser user = mAuth.getCurrentUser(); 
String userId = user.getUid(); 
User user = new User(26, "M", "user001"); 
DatabaseReference mRef = database.getReference().child("Users").child(userId); 
mRef.setValue(user); 

公告不存在Java对象中的商店用户的uid没有字段。这取决于你,但我没有包括它有两个原因。首先,在数据库中,我们使用用户的uid作为将数据存储在唯一位置的密钥。其次,由于您使用的是Firebase身份验证,如果您需要获取当前登录用户的ID,则可以在您的应用中通过FirebaseAuth访问它。

+0

非常感谢,在行中:DatabaseReference mRef = database.getReference()。child(“Users”)。child(userID); 我想你的意思是userId对吗? ,因为我看不到用户ID在哪里声明。 – rainman

+0

是的,没错,应该是“userId” –

+0

好的,谢谢我在这里有其他问题:http://stackoverflow.com/questions/39550149/check-if-user-is-authtificated-for-first-time -in-firebase-google-authentificatio, 如果您有任何想法 – rainman

0

只要改变这一行:

DatabaseReference mRef = database.getReference().child("Users").push(); 

这样:

DatabaseReference mRef = database.getReference().child("Users"); 

推送()自动添加一个唯一的键。

+0

当我进行更改时,它不会创建新的用户节点来覆盖现有的节点。 – rainman

+1

这很有意义,因为现在您的代码正在告知Firebase每次在用户 - >用户中写入子级信息。请看看Kevin O'Neil的回答,并尝试像这样实施。 –