【问题标题】:Retrieve Current User's Data Firebase?检索当前用户的数据 Firebase?
【发布时间】:2017-01-06 06:31:57
【问题描述】:

我在使用 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);

哦,如果您想知道为什么我有多个 DatabaseReference,那是因为我正在测试一些东西以更好地了解发生了什么,仅此而已。

更新:

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

但是,当我在 ValueEventListener 之外进行调试时,它会丢失当前用户。为什么会这样??我有人建议尝试mAuthListener,但是您无法获取数据快照,因此这似乎几乎没有用,除非您想要用户的电子邮件和firebase为您保存的显示名称...帮助?我需要数据库信息而不是当前用户的登录/身份验证信息!

【问题讨论】:

  • 请给我看看你的 Firebase 数据库快照
  • 这里是DB SnapShot@RjzSatvara 的链接

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


【解决方案1】:

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

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

【讨论】:

  • 如何从数据库中获取数据?换句话说,由于没有侦听器,我该如何使用 datasnapshot?
【解决方案2】:

尝试将您的 getInstance、getReference 等语句移动到您的 OnCreate 部分。只在 OnCreate 之前声明你的变量,但不要在那里实例化它们。

好的,也许你可以通过将这个添加到 onCancelled 方法来分析错误:

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

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

【讨论】:

  • 它仍然没有工作,但你对声明是绝对正确的。不过我已经搬走了,谢谢!
  • 我已经尝试添加日志,但我假设整个方法都被跳过了,因为日志甚至没有显示出来......不知道为什么?
【解决方案3】:
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());
            }
        });

【讨论】:

  • 我添加了这个,目前还没有。
  • 检查此代码.. 而不是 ref.child(MAIN_NODE_NAME) 添加您的主节点..表示根名称
【解决方案4】:

如果有人遇到这个问题,解决方案是这种现象被称为异步加载。换句话说,执行顺序是导致我的错误的原因,因为数据库的读取速度不够快。如需进一步解释,请阅读此thread

我的问题的解决方案是将填充 recyclerview 所需的所有内容放在onDataChange 中。这将允许 recycerlview 及时更新应用程序加载。

感谢所有花时间尝试帮助我的人!

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多