我正在了解Firebase并尝试在用户系统中实施Firebase Auth和Firebase数据库。 我知道如何在Facebook上使用Firebase身份验证,但我想为每个用户添加一些属性(在Firebase身份验证中,我们只有电子邮件,uid,提供商和个人资料图片网址。)
我的解决方案是创建用户注册表:
问题
所以我想做的只是在用户第一次登录时才进行推送。这是我的MainActivity:
public class MainActivity extends AppCompatActivity {
DatabaseReference myRef1;
DatabaseReference myRef;
private int RC_SIGN_IN = 1;
private String urlI, uid, name, uide;
boolean check_rate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myRef1 = FirebaseDatabase.getInstance().getReference();
myRef = myRef1.child("Usuarios");
FirebaseAuth auth = FirebaseAuth.getInstance();
id();
if (auth.getCurrentUser() != null) {
uide = auth.getInstance().getCurrentUser().getUid().toString();
if (check_rate) {
startActivity(new Intent(this, HomeActivity.class));
finish();
} else {
Map mProfile = new HashMap();
mProfile.put("name", auth.getInstance().getCurrentUser().getDisplayName().toString());
mProfile.put("image", auth.getInstance().getCurrentUser().getPhotoUrl().toString());
mProfile.put("uid", auth.getInstance().getCurrentUser().getUid().toString());
myRef.push().setValue(mProfile);
startActivity(new Intent(this, HomeActivity.class));
finish();
}
} else {
// abre a tela de login
startActivityForResult(
AuthUI.getInstance()
.createSignInIntentBuilder()
.setIsSmartLockEnabled(false)
.setProviders(
AuthUI.FACEBOOK_PROVIDER)
.build(),
RC_SIGN_IN);
}
}
private void id() {
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Map data = (Map) dataSnapshot.getValue();
//profile
urlI = (String) (data.get("image"));
name = (String) (data.get("name"));
uid = (String) (data.get("uid"));
check_rate = data.containsKey(uide);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
Map data = (Map) dataSnapshot.getValue();
//profile
//Map mData = (HashMap) data.get("profile");
urlI = (String) (data.get("image"));
name = (String) (data.get("name"));
uid = (String) (data.get("uid"));
check_rate = data.containsKey(uide);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
这不起作用。用户每次登录时都会上传。 请帮忙
答案 0 :(得分:0)
如果您尝试存储商品列表,通常最好将这些商品存储在其自然键下。
对于自然键为uid
的用户。如果您将用户存储在其uid下,则可以直接确定存储用户的位置:
Map mProfile = new HashMap();
mProfile.put("name", auth.getInstance().getCurrentUser().getDisplayName().toString());
mProfile.put("image", auth.getInstance().getCurrentUser().getPhotoUrl().toString());
myRef.child(auth.getInstance().getCurrentUser().getUid().toString())
.setValue(mProfile);
使用这种数据结构,如果您第二次写同一个用户,它将最终再次写入同一位置。因此,不会发生数据重复。