如何在firebase firestore android中检索文档以匹配我的特定登录凭据



我在下面有一个这种结构的火球

我的Firestore数据库的结构

它有两个用户,即教堂管理员和普通教堂用户

对于教会管理员,这是注册新教会的代码

public void onBoardChurchDetails(String church_name, String church_addr, String church_email, String church_leadName, String churchPhone, String church_icon, String churchDescr, String church_regStat, final String uid) {
if (networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
rhemaCollRef = rChurchFireStore.collection("rhema_churches");
rhemaHiveChurchSubClass = getRhemaHiveChurchSubClass();
if (rhemaHiveChurchSubClass.checkChurchEmptyParams(church_icon, church_name, church_addr, churchPhone, church_email, church_leadName, churchDescr, church_regStat,uid) == 1) {
rhemaHiveChurchModelClass = getChurchModelClass(church_name, church_addr, church_email, church_leadName, churchPhone, church_icon, churchDescr, church_regStat,uid);
rhemaCollRef.document(church_name).set(rhemaHiveChurchModelClass).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
try {
getAuto().getToast(c, " Congratulations you Just Registered a new Church", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
intent  = new Intent(c, RhemaHiveChurchPortal.class);
bundle.putString("church_id", uid);
intent.putExtras(bundle);
startActivity(intent);
clearChurchDetails();
}
catch(NullPointerException np){
getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + np.getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
} else {
getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + task.getException().getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
startActivity(getAuto().newActivityStarter(c, RhemaHiveChurchPortal.class));
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + e.getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
});

} else {
getAuto().getToast(c, "Oops Seems we are missing out some data here", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
} else {
getAuto().getToast(c, "Oops Seems No Internet Service is connected", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
}

对于用户注册,我有

public void onBoardUserWithoutSocial(String fName, String lName, String gender, String userType, String dob, String regStat, String imgPath, String userEmail, String phone , String about, final String churchName, String branchName, String addr, String city, String country, String postalCode, final String uid) {
if (networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
fstore = getFstore();
fiReference = fstore.collection("rhema_churches");
rhemaHiveUserSubClass = getRhemaHiveUserSubClass();
if (rhemaHiveUserSubClass.checkEmptyParam(fName, lName, branchName, churchName, addr, country, city, dob, gender, postalCode, regStat, phone,  userType,imgPath,userEmail,about,uid) == 1) {
rhemaHiveUserModelClass = getUserModelClass(fName,lName,gender,userType,dob,regStat, imgPath,userEmail,phone,about,churchName,branchName,addr,city,country,postalCode,uid);
fiReference.document(churchName).collection("members_data").document(getFullName(fName,lName)).set(rhemaHiveUserModelClass).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
try{
getAuto().getToast(c, "Congratulation You've onboarded sucessfully..",RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
bundle.putString("user_id", uid);
bundle.putString("user_church",churchName);
intent.putExtras(bundle);
startActivity(intent);
clearUserDetails();
}
catch(NullPointerException np){
getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + np.getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
}
else{
getAuto().getToast(c,RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + task.getException().getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + e.getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
});
} else {
getAuto().getToast(c, "Oops ! !..Seems we are missing out some of your details", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
}
else{
getAuto().getToast(c, "Oops ! !..Seems you need to put on your data", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
}

当成功注册时,我希望普通用户能够在使用Facebook、Twitter或谷歌等任何提供商进行身份验证后登录,他的门户网站应该使用uuid和电话号码的组合来检索他的个性化门户网站

要检索Church档案,请参阅下面的代码

public void retreiveChurchDetails(String id) throws NullPointerException{
if(networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
FirebaseFirestore fS = getFStore();
rhemaCollRef = fS.collection("rhema_churches");
rhemaCollRef.whereEqualTo("church_uid", id ).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for(DocumentSnapshot documentSnapshot  : queryDocumentSnapshots.getDocuments()){
church_name = documentSnapshot.getString("church_name");
church_email = documentSnapshot.getString("church_email");
church_phone = documentSnapshot.getString("church_phone");
church_pix_link = documentSnapshot.getString("church_pix");
getTextView(R.id.church_retr_name).setText(church_name);
getTextView(R.id.church_retr_email).setText(church_email);
getTextView(R.id.church_retr_phone).setText(church_phone);
ld_wt_gl(c,church_pix_link,44,44,getImg(R.id.church_retr_logg));
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
getAuto().getToast(c,RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + e.getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
});
}
else{
getAuto().getToast(c, "Oops ! !..Seems we need an internet connection for this", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
}

我的问题是,我如何检索用户详细信息,因为我完全知道要获得用户数据,你必须遵循的结构

rhema_churches=>church_name(需要确定如何获取(=>document=>members_data=>user_data

请参考上所附的数据库结构

请帮帮我…

看看我尝试了什么

public void retrUserDet(final String uid, String church_name) throws NullPointerException{
if(networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
FirebaseFirestore fS = getFStore();
rhemaCollRef = fS.collection("rhema_churches");
rhemaCollRef.document(church_name).collection("members_data").whereEqualTo("user_uid",uid).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
if(!queryDocumentSnapshots.getDocuments().isEmpty()){
for(DocumentSnapshot doc : queryDocumentSnapshots.getDocuments()){
user_email = doc.getString("user_email");
user_name = doc.getString("user_fName") + doc.getString("user_lName");
user_phone = doc.getString("user_phone");
user_pix_link = doc.getString("user_pix");
getTex(R.id.user_retr_email).setText(user_email);
getTex(R.id.user_retr_name).setText(user_name);
getTex(R.id.user_retr_phone).setText(user_phone);
ld_wt_gl(c,user_pix_link,44,44,getImg(R.id.user_retr_logg));
}
}
}
});
}
}

上述方法需要两个参数来进行查询,即uid和churchName

这是我尝试过的检索churchName的方法,但它不起作用

public String retrChurchName(String uid){
if (networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
rhemaCollRef = rChurchFireStore.collection("rhema_churches");
//rhemaCollRef.
rhemaCollRef.whereEqualTo("uid",uid).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for(DocumentSnapshot documentSnapshot : queryDocumentSnapshots.getDocuments()
)
{
if(documentSnapshot.exists()){
churchName = documentSnapshot.getString("church_name");
}
else{
getAuto().getToast(c,"Document doesnt exist", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
getAuto().getToast(c,RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + e.getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
});
return churchName;
}
else{
getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + networkInfo.getExtraInfo(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
return "";
}

谢谢!

所以我能够解决我的问题,并且我的代码运行良好。。感谢Alex Mamo

我必须做的第一件事是为教会和用户重组我的入职代码

对于Church,我有

public void onBoardChurchDetails(String church_name, String church_addr, String church_email, String church_leadName, String churchPhone, String church_icon, String churchDescr, String church_regStat, final String uid, String userType) {
if (networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
rhemaCollRef = rChurchFireStore.collection("rhema_churches");
rhemaHiveChurchSubClass = getRhemaHiveChurchSubClass();
if (rhemaHiveChurchSubClass.checkChurchEmptyParams(church_icon, church_name, church_addr, churchPhone, church_email, church_leadName, churchDescr, church_regStat, uid, userType) == 1) {
rhemaHiveChurchModelClass = getChurchModelClass(church_name, church_addr, church_email, church_leadName, churchPhone, church_icon, churchDescr, church_regStat, uid, userType);
rhemaCollRef.document(uid).set(rhemaHiveChurchModelClass).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
try {
getAuto().getToast(c, " Congratulations you Just Registered a new Church", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
bundle.putString("church_id", uid);
intent.putExtras(bundle);
startActivity(intent);
//clearChurchDetails();
} catch (NullPointerException np) {
getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + np.getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
} else {
getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + task.getException().getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
startActivity(getAuto().newActivityStarter(c, RhemaHiveChurchPortal.class));
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + e.getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
});

} else {
getAuto().getToast(c, "Oops Seems we are missing out some data here", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
} else {
getAuto().getToast(c, "Oops Seems No Internet Service is connected", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
}

对于用户登录,我有

public void onBoardUserWithoutSocial(String fName, String lName, String gender, String userType, String dob, String regStat, String imgPath, String userEmail, String phone , String about, final String churchName, String branchName, String addr, String city, String country, String postalCode, final String uid) {
if (networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
fstore = getFstore();
fiReference = fstore.collection("rhema_churches");
rhemaHiveUserSubClass = getRhemaHiveUserSubClass();
if (rhemaHiveUserSubClass.checkEmptyParam(fName, lName, branchName, churchName, addr, country, city, dob, gender, postalCode, regStat, phone,  userType,imgPath,userEmail,about,uid) == 1) {
rhemaHiveUserModelClass = getUserModelClass(fName,lName,gender,userType,dob,regStat, imgPath,userEmail,phone,about,churchName,branchName,addr,city,country,postalCode,uid);
fiReference.document(uid).set(rhemaHiveUserModelClass).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
try{
getAuto().getToast(c, "Congratulation You've onboarded sucessfully..",RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
bundle.putString("user_id", uid);
bundle.putString("user_church",churchName);
intent.putExtras(bundle);
startActivity(intent);
clearUserDetails();
}
catch(NullPointerException np){
getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + np.getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
}
else{
getAuto().getToast(c,RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + task.getException().getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + e.getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
});
} else {
getAuto().getToast(c, "Oops ! !..Seems we are missing out some of your details", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
}


else{
getAuto().getToast(c, "Oops ! !..Seems you need to put on your data", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
}

因此,与其把一个收藏放在另一个收藏中。。我只是有一个单独的集合作为rhema_churches,然后为每种类型的用户都有一个ID。。

见下方的结构

新的数据库结构

使用这种结构,很难使用多个提供商登录,因为您使用的每个提供商都作为文档id登录,这很容易检索

这就是用户和教会的新查询现在看起来像的样子

对于Church Query,我们有

public void retreiveChurchDetails(String id) throws NullPointerException {
if (networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
FirebaseFirestore fS = getFStore();
rhemaCollRef = fS.collection("rhema_churches");
rhemaCollRef.whereEqualTo("church_uid", id).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (DocumentSnapshot documentSnapshot : queryDocumentSnapshots.getDocuments()) {
church_name = documentSnapshot.getString("church_name");
church_email = documentSnapshot.getString("church_email");
church_phone = documentSnapshot.getString("church_phone");
church_pix_link = documentSnapshot.getString("church_pix");
getTextView(R.id.church_retr_name).setText(church_name);
getTextView(R.id.church_retr_email).setText(church_email);
getTextView(R.id.church_retr_phone).setText(church_phone);
ld_wt_gl(c, church_pix_link, 88, 88, getImg(R.id.church_retr_logg));
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + e.getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}
});
} else {
getAuto().getToast(c, "Oops ! !..Seems we need an internet connection for this", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
}

}

然后对于用户查询,我有

public void retrUserDet(final String uid) throws NullPointerException{
if(networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
FirebaseFirestore fS = getFStore();
rhemaCollRef = fS.collection("rhema_churches");
rhemaCollRef.whereEqualTo("user_uid",uid).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
if(!queryDocumentSnapshots.getDocuments().isEmpty()){
for(DocumentSnapshot doc : queryDocumentSnapshots.getDocuments()){
user_email = doc.getString("user_email");
user_fName  = doc.getString("user_fName");
user_lName = doc.getString("user_lName");
user_phone = doc.getString("user_phone");
user_pix_link = doc.getString("user_pix");
getTex(R.id.user_retr_email).setText(user_email);
getTex(R.id.user_retr_name).setText(retFullName(user_fName,user_lName));
getTex(R.id.user_retr_phone).setText(user_phone);
ld_wt_gl(c,user_pix_link,120,120,getImg(R.id.user_retr_logg));
}
}
}
});
}
}

关键是永远不要过早地使数据库结构复杂化。。对于进入Firestore的任何类型的数据,它都有一个用户类型,它也可以帮助我过滤

谢谢!

最新更新