首页 文章

检索当前用户的数据Firebase?

提问于
浏览
1

我在使用Firebase时遇到了问题,并且我已经读到了使用Firebase通过其ID获取当前用户的好方法: FirebaseAuth.getInstance().getCurrentUser().getUid(); ,然后使用 addListenerForSingleValueEvent 通过 datasnapshot 获取数据 . 很棒,在我的一个活动中,代码工作,我成功地抓取了数据 . 但是,在我的其他活动中,根据调试器完全忽略了监听器......为什么会这样,我该如何解决这个问题呢?或者,还有更好的方法?

这是我的活动:

public class GroupActivity extends AppCompatActivity {
//Tag
private static String TAG = "GroupActivity";

//Firebase
private FirebaseDatabase database = FirebaseDatabase.getInstance();
private DatabaseReference mDatabase = database.getReference("users").child("groups"); //Does Users -> Groups
private DatabaseReference mRef = FirebaseDatabase.getInstance().getReference().child("users");

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_group);
    ButterKnife.bind(this);
    initializeBottomBar();

    //Users from selected list -- previous activity data.
    selectedUsers = (List<UserList>) getIntent().getSerializableExtra("users");
    String groupName = getIntent().getStringExtra("groupName");

    //CURRENT USER GOES IN FIRST.
    // TODO : add current user.
    String currentUserID = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference newRef = mRef.child(currentUserID);
    newRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.d(TAG, "Name: " + dataSnapshot.child("name").getValue());

            name = String.valueOf(dataSnapshot.child("name").getValue());
            email = String.valueOf(dataSnapshot.child("email").getValue());
            username = String.valueOf(dataSnapshot.child("username").getValue());
            ID = String.valueOf(dataSnapshot.child("uid").getValue());

            mCurrentUser.setName(name);
            mCurrentUser.setUsername(username);
            mCurrentUser.setEmail(email);
            mCurrentUser.setUid(ID);

            selectedUsers.add(mCurrentUser);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });


    //ID
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
    String uniqueKey = ref.child(currentUserID).child("groups").push().getKey();

    //Groups of SelectedUsers!
    SelectedUsers members = new SelectedUsers(groupName, uniqueKey, selectedUsers);
    List<SelectedUsers> groups = new ArrayList<>();
    groups.add(members);

哦,如果你想知道为什么我有多个DatabaseReferences,那是因为我正在测试一些东西,以便更好地理解发生了什么,就是这样 .

更新:

我已经决定尝试通过在 ValueEventListener 内部添加断点来调试 selectedUsers.add(mCurrentUsers) ,它会根据需要显示2个项目 .

但是,当我在 ValueEventListener 之外进行调试时,有人建议尝试使用 mAuthListener ,但是你无法获取数据快照,所以除非你想要用户's email and displayname which firebase holds for you... help? I need the database information NOT the current user'的登录/验证信息,否则这几乎看起来毫无用处!

4 回答

  • 0

    您可以使用以下代码获取当前用户详细信息:

    mAuthListener = new FirebaseAuth.AuthStateListener() {
                @Override
                public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                    FirebaseUser user = firebaseAuth.getCurrentUser();
                    if (user != null) {
                        // User is signed in
                        Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                    } else {
                        // User is signed out
                        Log.d(TAG, "onAuthStateChanged:signed_out");
                    }
                    // [START_EXCLUDE]
                    updateUI(user);
                    // [END_EXCLUDE]
                }
    };
    

    更多详情请访问以下链接以获得最佳示例 . https://github.com/firebase/quickstart-android/tree/master/auth

  • 0

    尝试将getInstance,getReference等语句移动到OnCreate部分 . 仅在OnCreate之前声明您的变量,但尚未在那里实例化它们 .

    好吧,也许你可以通过addind this来分析错误到onCancelled方法:

    Log.d("onCancelled: ", databaseError.toException());
    

    实际上,mCurrentUser在哪里/如何声明或创建?

  • 0
    Firebase ref = new Firebase(FIREBASE_URL);
    ref.child("MAIN_NODE_NAME/S3l3yRh8Tq.....").addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    Log.e("!_@@<DATA>",dataSnapshot+");
                }
    
                @Override
                public void onCancelled(FirebaseError firebaseError) {
                    Log.e("MainActivity", "onCancelled", firebaseError.toException());
                }
            });
    
  • 0

    如果遇到任何问题,这个问题的解决方案就是这种现象称为异步加载 . 换句话说,执行的顺序是导致我的错误的原因,因为数据库的读取速度不够快 . 如需进一步说明,请按照阅读本thread .

    我的问题的解决方案是将所有需要的东西填入 onDataChange 内的recyclerview . 这将允许recycerlview在应用程序加载时更新 .

    谢谢大家和任何花时间尝试帮助我的人!

相关问题