我正在尝试使用Firebase编写Messenger应用程序。
在数据库中,我有一些条目,即User.class对象。我正在尝试编写可以从数据库下载User对象的函数。我认为为此任务构建单独的类(UserManager)会更好,因为我不喜欢在代码中弄乱。但是有一个问题,因为在onCreate方法中我需要使用User对象从数据库下载一些额外的信息来创建对话列表,所以在此之前应该从服务器下载用户。此外,如果用户不在数据库中,它应该使用FirebaseAuth创建并将用户推送到数据库(我已经开始工作)。
我应该构建扩展AsynchTask的类,还有下载用户,然后用用户下载的数据更新UI? 我如何知道用户是否已下载。可能我应该建立一些倾听者,但我不知道该怎么做。
其他问题:
如果我将此引用与值侦听器一起使用,我是否从对象内部获取用户对象或某些值?
1 << 65 => 1 << 1 => 2
这是我的数据库:
每个条目密钥都是来自FirebaseAuth的用户ID,以便于实施。
我已经在这个问题上开了几天,尝试了不同的方法。我会给你任何帮助。我认为,一些代码或方案将是一个巨大的帮助。
答案 0 :(得分:0)
也许这部分代码可以帮助你弄清楚:
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users")
.child(mUserID);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e(TAG, "DatabaseError: " + databaseError.getMessage());
}
});
答案 1 :(得分:0)
我如何知道用户是否已下载?
您可以为值false
的每个用户添加一个标记,并在下载用户对象后将值设置为true
,但这不是Firebase的工作方式。您无法知道数据库中的用户何时完成下载Firebase is a realtime database
并且获取数据可能永远不会完成。这就是为什么命名为实时数据库,因为在任何momemnt中,User
对象下的数据都可以更改,可以添加或删除属性。
只有当您写或更新数据时才能使用CompletionListener
,并且当数据库服务器确认操作时您会收到通知但阅读数据时不能使用此界面。
如果我将此引用与值侦听器一起使用,我是否从对象内部获取用户对象或某些值?
如果您正在侦听的值是User
对象,那么您将获得User
个对象。如果值是另一种类型的对象,也可以是String
(也是一个对象),那么您将获得该类型的对象,该对象也可以是String
对象。请注意,只有Firebase数据库中的键始终字符串。