检查Firebase数据库中是否存在某个密钥

时间:2016-12-02 21:08:05

标签: android facebook firebase firebase-realtime-database firebase-authentication

我正在了解Firebase并尝试在用户系统中实施Firebase Auth和Firebase数据库。 我知道如何在Facebook上使用Firebase身份验证,但我想为每个用户添加一些属性(在Firebase身份验证中,我们只有电子邮件,uid,提供商和个人资料图片网址。)

我的解决方案是创建用户注册表: Database image

问题

所以我想做的只是在用户第一次登录时才进行推送。这是我的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) {

            }

        });
    }

这不起作用。用户每次登录时都会上传。 请帮忙

1 个答案:

答案 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);

使用这种数据结构,如果您第二次写同一个用户,它将最终再次写入同一位置。因此,不会发生数据重复。