如何获取用户当前登录的帖子的密钥

时间:2017-08-05 13:34:43

标签: java android firebase firebase-realtime-database

我想要得到的帖子ID,其中用户在即在我目前的情况下签署的,我需要这样的:“-Kqm0-HrwGNgDhvTqOjU”,因为当前的用户ID为“OiHtZxtLUeh63UzudUChEpSODPx2”

my database structure

这样我就可以获得当前登录用户的名称

这是我的代码:

public class MyAccount extends AppCompatActivity {

    private Button mSetupButton;
    private EditText mSetupName;
    private EditText mSetupBio;
    private ImageButton mSetupImageButton;
    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;
    private String mPostKey=null;
    private DatabaseReference mDatabase;
    private FirebaseDatabase mFirebasedatabase;
    private DatabaseReference myRef;
    private String userId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_account);

        DatabaseReference mdatabaseR = FirebaseDatabase.getInstance().getReference().child("Profiles");


        mAuth = FirebaseAuth.getInstance();
        mFirebasedatabase=FirebaseDatabase.getInstance();

        FirebaseUser currentFirebaseUser = FirebaseAuth.getInstance().getCurrentUser() ;
        //Toast.makeText(this, "" + currentFirebaseUser.getUid(), Toast.LENGTH_SHORT).show();




        mSetupName = (EditText) findViewById(R.id.accountName);
        mSetupBio = (EditText) findViewById(R.id.accountBio);
        mSetupButton = (Button) findViewById(R.id.accountButton);
        mSetupImageButton = (ImageButton) findViewById(R.id.accountImageButton);

        final DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Profiles");


        String user_id=mAuth.getCurrentUser().getUid();
        DatabaseReference myRef=ref.child(user_id);


        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                for (DataSnapshot objSnapshot: snapshot.getChildren()) {
                    String obj = objSnapshot.getKey();
                    Toast.makeText(MyAccount.this,obj, Toast.LENGTH_LONG).show();

                    String post_name = (String) objSnapshot.child("Name").getValue();
                    mSetupName.setText(post_name);

                }
            }
            @Override
            public void onCancelled(DatabaseError firebaseError) {

            }
        });



        //Toast.makeText(MyAccount.this,user_id,Toast.LENGTH_LONG).show();

    }

}
在“String obj”中我因为for循环而得到所有帖子ID,但在我的情况下我只需要用户登录的那个,即其uid为“OiHtZxtLUeh63UzudUChEpSODPx2”

2 个答案:

答案 0 :(得分:0)

你必须循环每个对象,如下所示:

ref.child('users').orderByChild('uid').equalTo('your_uid').on("value", 
function(snapshot) {
 console.log(snapshot.val());

});

答案 1 :(得分:0)

有两种解决方案:

  1. 使用查询查找用户的个人资料
  2. 将您的JSON结构更改为以UID(推荐
  3. 存储用户

    使用查询查找用户的配置文件

    final DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Profiles");
    Query query = ref.orderByChild("uid").equalTo("OiHtZxtLUeh63UzudUChEpSODPx2");
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot objSnapshot: snapshot.getChildren()) {
                String obj = objSnapshot.getKey();
    

    将您的JSON结构更改为在其UID下存储用户

    如果您拥有具有自然键的项目集合,则应将这些项目存储在其自然键下。因此,在一组用户中,将用户存储在他们的UID下:

    profiles
      OiHtZxtLUeh63UzudUChEpSODPx2
        email: "..."
        name: "..."
        phone: "..."
      UIDofuser2
        email: "..."
        name: "..."
        phone: "..."
    

    这有许多优点,其中一些是:

    • 根据定义,每个UID只能在此结构中出现一次。
    • 在此方案中,可以更轻松地保护对用户个人资料的访问权限(如果需要),如shown in the documentation
    • (对您而言最重要)您无需直接阅读即可访问用户,而无需查询:

      final DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Profiles");
      DatabaseReference userRef = ref.child("OiHtZxtLUeh63UzudUChEpSODPx2");
      userRef.addValueEventListener(new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot snapshot) {
              String obj = objSnapshot.getKey();
      

      在最后一个代码段中,您会注意到不再需要Query,这可以提高代码的可伸缩性。虽然这可能不会对用户列表产生很大影响,但在其他情况下可能会有所不同。由于我们直接读取,我们也不再需要onDataChange()中的循环,这提高了代码的可读性。