所以,我最近了解了firebase数据库,现在我能够插入数据了。我有这个脚本,用于将数据存储到我的firebase。
mDatabase = FirebaseDatabase.getInstance().getReference("Biodata");
String userId = mDatabase.push().getKey();
Biodata bio = new Biodata("MyUser", "MyUser@email.com");
mDatabase.child(userId).setValue(bio);
上面的脚本位于oncreate
,所以当我一次又一次地运行Activty时,数据会插入两次或更多次
这是我的firebase
Biodata
-LAuyJho4kTnJt5WuCtJ
Email: "MyUser@email.com"
Fullname: "MyUser"
我的bidata课程
@IgnoreExtraProperties
public class Biodata {
public String Fullname;
public String Email;
public Biodata() {
}
public Biodata(String Fullname, String Email) {
this.Fullname = Fullname;
this.Email = Email;
}
}
那么,我如何阻止我的应用程序两次插入相同的数据?
答案 0 :(得分:2)
首先,您不必在onCreate方法上调用它。但这是另一种不创建重复的简单方法。您必须为每个用户创建一个随机密钥。比如说,电子邮件ID对所有用户都是唯一的。所以
mDatabase = FirebaseDatabase.getInstance().getReference("Biodata");
Biodata bio = new Biodata("MyUser", "MyUser@email.com");
mDatabase.child("MyUser@email.com").setValue(bio);
通过这种方式,用户的详细信息位于他们自己的电子邮件ID下。您也可以更轻松地获取详细信息。此外,这不会创建重复项,因为电子邮件ID是唯一的。在firebase中它看起来像这样:
Biodata
MyUser@email.com
Email: "MyUser@email.com"
Fullname: "MyUser"
所以稍后如果你想获得用户名,你只需要
DatabaseReference ref= mDatabase.child("MyUser@email.com");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Biodata bio = dataSnapshot.getValue(Biodata .class);
// and bio.getName() for getting the name
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 1 :(得分:1)
请尝试以下代码可能会帮助您
public void setData(){
final DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference();
Query queryToGetData = dbRef.child("Biodata")
.orderByChild("Email").equalTo("MyUser@email.com");
queryToGetData.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(!dataSnapshot.exists()){
String userId = dbRef.child("Biodata").push().getKey();
Biodata bio = new Biodata("MyUser", "MyUser@email.com");
dbRef.child("Biodata").child(userId).setValue(bio);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
答案 2 :(得分:1)
您不应将电子邮件添加为父节点,否则您将收到错误。
首先你要添加两次数据,这是因为你在onCreate()
下有这个,它应该在一个按钮或任何可能发生的事件下。
其次,您使用push()
生成随机ID,因此每次调用onCreate()
时都会添加新数据,因为push()
用于分隔记录。
要防止出现此问题,请在按钮下添加用户的创建(例如,在“注册”按钮下)。
如果您想将其保留在onCreate()
下,请执行以下操作:
mDatabase = FirebaseDatabase.getInstance().getReference("User");
FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
String userId=user.getUid();
Biodata bio = new Biodata("MyUser", "MyUser@email.com");
mDatabase.child(userId).setValue(bio);
如果您使用firebase身份验证以及用户登录后,上述操作将起作用。 getUid()
将从firebase身份验证中检索用户ID,该身份对每个用户都是唯一的。然后,您就可以将其添加到数据库中。