【问题标题】:Check if exists a certain key in Firebase Database检查 Firebase 数据库中是否存在某个键
【发布时间】:2016-12-02 21:08:05
【问题描述】:

我正在学习 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) {

            }

        });
    }

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

【问题讨论】:

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


    【解决方案1】:

    如果您尝试存储项目列表,通常最好将这些项目存储在其自然键下。

    对于自然键是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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 2018-06-02
      • 2020-11-02
      相关资源
      最近更新 更多