Java 如何从Firestore获取数组并在Android中循环?
我试图获取一个名为services的字段,它是Firestore文档中的字符串数组 我是这样做的:Java 如何从Firestore获取数组并在Android中循环?,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,我试图获取一个名为services的字段,它是Firestore文档中的字符串数组 我是这样做的: fAuth = FirebaseAuth.getInstance(); fStore = FirebaseFirestore.getInstance(); fAuth.signInWithEmailAndPassword(Etemail.getText().toString(), Etpassword.getText().toString()).addOnSu
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
fAuth.signInWithEmailAndPassword(Etemail.getText().toString(), Etpassword.getText().toString()).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
Uid = authResult.getUser().getUid();
checkUserAccessLevel(Uid);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(LoginActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
private void checkUserAccessLevel(String uid) {
DocumentReference df = fStore.collection("Users").document(uid);
df.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
List<String> services = new ArrayList<>();
DocumentSnapshot document = task.getResult();
if (document.exists()) {
Map<String, Object> map = document.getData();
for (Map.Entry<String, Object> entry : map.entrySet()) {
services.add(entry.getValue().toString());
}
Log.d(TAG, services.toString());
} else {
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
}
});
}
fAuth=FirebaseAuth.getInstance();
fStore=FirebaseFirestore.getInstance();
fAuth.signInWithEmailAndPassword(Etemail.getText().toString(),Etpassword.getText().toString()).addOnSuccessListener(新OnSuccessListener
请帮助我完成此任务。要获取“服务”数组中存在的值,您需要读取文档的内容。记住DocumentSnapshot的方法返回一个可以简单迭代的映射,如下代码行所示:
FirebaseFirestore fStore = FirebaseFirestore.getInstance();
DocumentReference df = fStore.collection("Users").document(uid);
df.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
List<String> services = new ArrayList<>();
DocumentSnapshot document = task.getResult();
if (document.exists()) {
Map<String, Object> map = document.getData();
for (Map.Entry<String, Object> entry : map.entrySet()) {
services.add(entry.getValue().toString());
}
Log.d(TAG, services.toString());
//Do what you need to do with your services List
} else {
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException()); //Don't ignore potential errors!
}
}
});
您可以使用get()
方法或getData()
方法
get()
方法接受一个字符串
参数(字段名-注意此方法也有不同的版本)并返回对象
,您需要对您的数据类型进行分类。如果您不想从文档中获取作为映射的整个数据,可以将其用于单个字段(或多个字段)
getData()
方法返回文档中的全部数据,因为Map
String
是文档的字段名,而Object
是属于该字段的数据。使用字段名(或名称)可以获取属于该字段(或多个字段)的数据。此外,还需要转换为数据类型
使用Get()
方法根据字段名获取数据:
df.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
List<String> services = new ArrayList<>(),
timeSlot = new ArrayList<>();
if (document.exists()) {
services = (List<String>) document.get("services");
timeSlot = (List<String>) document.get("time_slot");
} else {
Log.e(TAG, "Document is not exist");
}
}else{
Log.e(TAG, "Task Failed: " + task.getException());
}
}
});
你还没有说你提供的代码有什么问题。确保你发布了你想要的输出,你实际得到的,任何崩溃等。嘿,Alex,谢谢你的回复和时间。在logcat中,它显示了完整的集合,如[人名,9864,[心脏病学,肿瘤学,神经病学,泌尿学],1,xyz@gmail.com, [09:00至10:00,10:00至11:00,11:00至12:00,12:00至13:00]]我只是想要一系列服务,如=>[Cardiology,Oncology,Neurology,Urology]有什么解决办法吗?这是我从firestore获得的json对象结构:{FullName=XYZ JKL,PhoneNumber=9865####,services=[Cardiology,Onology,Neurology,Urology,Urology],isAdmin=1,UserEmail=abc@gmail.com,time_slot=[09:00至10:00,10:00至11:00,11:00至12:00,12:00至13:00]}请编辑您的问题并添加您现在使用的代码并生成输出。我已编辑了帖子的代码,请检查。这是应用您提供的修补程序后的代码。好的,让我再次检查。
df.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
List<String> services = new ArrayList<>(),
timeSlot = new ArrayList<>();
if (document.exists()) {
services = (List<String>) document.get("services");
timeSlot = (List<String>) document.get("time_slot");
} else {
Log.e(TAG, "Document is not exist");
}
}else{
Log.e(TAG, "Task Failed: " + task.getException());
}
}
});
df.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
List<String> services = new ArrayList<>(),
timeSlot = new ArrayList<>();
if (document.exists()) {
Map<String, Object> data = document.getData();
services = (List<String>) data.get("services");
timeSlot = (List<String>) data.get("time_slot");
} else {
Log.e(TAG, "Document is not exist");
}
}else{
Log.e(TAG, "Task Failed: " + task.getException());
}
}
});