我遇到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,那是因为我正在测试一些东西,以便更好地理解发生了什么,就是这样。
更新:
我决定通过在selectedUsers.add(mCurrentUsers)
内部添加断点来尝试调试ValueEventListener
,并根据需要显示2个项目。
然而,当我在ValueEventListener
之外进行调试时,它缺少当前用户。为什么会这样?我有人建议尝试mAuthListener
,但是你不能抓住数据快照,所以这几乎看起来没用,除非你想要用户的电子邮件和显示名称firebase为你保留...帮助?我需要数据库信息而不是当前用户的登录/验证信息!
答案 0 :(得分:0)
您可以使用以下代码获取当前用户详细信息:
toPrint = HouseArray[0].GetHouseName();
更多详情请访问以下链接以获得最佳示例。 https://github.com/firebase/quickstart-android/tree/master/auth
答案 1 :(得分:0)
尝试将getInstance,getReference等语句移动到OnCreate部分。只在OnCreate之前声明你的变量,但是还没有在那里实例化它们。
好的,也许你可以通过addind this来分析错误到onCancelled方法:
Log.d("onCancelled: ", databaseError.toException());
实际上,mCurrentUser在何处/如何声明或创建?
答案 2 :(得分: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());
}
});
答案 3 :(得分:0)
如果遇到任何人遇到此问题的解决方案是这种现象称为异步加载。换句话说,执行的顺序是导致我的错误的原因,因为数据库的读取速度不够快。如需进一步说明,请阅读此thread。
我的问题的解决方案是在onDataChange
内放置填充recyclerview所需的所有内容。这将允许recycerlview在应用程序加载时更新。
感谢大家和任何花时间尝试帮助我的人!