我希望在Firebase中设置类似于群聊的东西。如果您有正确的群组ID,就可以加入。
问题在于Firebase引用总是存在的。它们是动态创建的。为了允许在加入过程中进行一些错误检查,我想将创建新数据库条目的用户添加到用户表中。
完成这些步骤后,我调用一个辅助方法
问题在于:其他用户需要检查他们是否使用了有效的密钥进行连接。他们可以通过检查
有时写入过程需要很长时间,有时似乎完全失败。因此,我设置了监听器:
问题在于Firebase引用总是存在的。它们是动态创建的。为了允许在加入过程中进行一些错误检查,我想将创建新数据库条目的用户添加到用户表中。
public void createParty() {
// you need to be signed in to create a party
assertState(DBState.SignedIn);
// create a new party
ourPartyDatabaseReference = partiesDatabaseReference.push();
usersDatabaseReference = ourPartyDatabaseReference.child("users");
// write our user to the table of users, now the ourPartyReference actually exists
// and if you look for existing users, you will always find at least the original creator
Task initTask = usersDatabaseReference.child(user.getUid()).setValue(true);
完成这些步骤后,我调用一个辅助方法
connectToParty
来设置一些引用并将数据库连接状态更改为DBState.Connected
。现在,您可以获取聚会的密钥并将其传输给其他用户。在此,密钥是指Firebase中的名称。问题在于:其他用户需要检查他们是否使用了有效的密钥进行连接。他们可以通过检查
key/users
下是否有数据来完成此操作。因此,只有当第一个用户成功写入数据库时,聚会才是有效的。有时写入过程需要很长时间,有时似乎完全失败。因此,我设置了监听器:
Task initTask = usersDatabaseReference.child(user.getUid()).setValue(true);
initTask.addOnSuccessListener(new OnSuccessListener() {
@Override
public void onSuccess(Object o) {
connectToParty();
}
});
initTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
changeState(DBState.SignedIn, DBTransition.Failure);
}
});
这是一个测试内容,测试设置了一个连接,登录并创建一个派对。如果在特定的超时时间内创建了该派对,则测试通过。
有9次中的10次这个过程都能正常进行。但有时测试会失败。
这与超时时间太短无关。任务的回调函数根本没有被调用。我读到只有当您的连接在线时,此回调才有效。
因此,在我的代码中添加了 firebaseDatabase.goOnline();
,就在任务之前。但这并没有帮助。
我通过局域网连接到互联网。所有其他测试都通过,并且它们也需要访问firebase。例如登录过程。
正确的方法是什么,可以将值写入数据库并等待写入完成?