我正在尝试开发一种访问Cloud Firestore,读取用户数据并返回与其关联的地图的方法。据我了解,它不是在等待成功/失败侦听器,并且我已经尝试过将其更改为完整的侦听器,但结果是相同的。它跳过了听众。 我知道这是一个异步过程,但是我需要接收数据以在调用该方法的Activity上显示它们。
设置活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.binding = ActivitySettingsBinding.inflate(getLayoutInflater());
this.fbUtils = new FirebaseHandler(this);
setContentView(binding.getRoot());
}
@Override
protected void onStart() {
super.onStart();
User user = fbUtils.getCurrentUser();
if (user == null) {
findUserOrLogout();
} else {
showUserData(user);
}
}
FirebaseHandler
public User getCurrentUser() {
FirebaseUser user = auth.getCurrentUser();
if (user != null) {
this.userMap = getUserDBInfo(user.getUid());
this.profilePic = getUserPic(user.getUid());
if (this.userMap != null && this.profilePic != null) {
return new User(user, userMap, profilePic);
}
}
return null;
}
private Map<String, Object> getUserDBInfo(String uid) {
Log.d(TAG, "Getting user info for user '" + uid+"'");
DocumentReference docRef = db.collection("users").document(uid);
final Map<String, Object>[] userMap = new Map[]{null};
final boolean[] done = new boolean[]{false};
docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
if (documentSnapshot.exists()) {
Log.d(TAG, "DocShot: " + documentSnapshot);
userMap[0] = documentSnapshot.getData();
} else {
Log.d(TAG, "User's document not found");
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d(TAG, "Couldn't get the Document");
MainActivity.showToast("Couldn't get the Document", activity.getApplicationContext());
}
});
return userMap[0];
}
我在代码中做错什么了吗,或者有什么我可以更改的才能完成这项工作?
谢谢。
答案 0 :(得分:1)
您必须在Firebase控制台中更改规则,才能进行写操作。
您必须按照以下步骤进行操作:-
打开Firebase控制台并导航到数据库。
转到规则标签,然后将规则编辑为以下内容:-
{
"rules": {
".read": true,
".write": true
}
}
这将允许您在数据库上执行写操作。
请告诉我您是否需要屏幕截图。
答案 1 :(得分:0)
如果您的数据库要求经过身份验证的用户读写数据库,请在此处使用其他答案。它将创建一个巨大的安全漏洞,允许具有Internet连接的任何人完全读取和写入数据库。
您的代码应改为确保用户已登录,然后再尝试进行任何查询。通过在用户登录时使用auth state listener来获得回调,这才成为可能。只有在使用有效的用户对象调用此回调之后,才可以安全地进行需要身份验证的查询。