我的Firestore数据库结构:
|
|=>root_collection
|
|=>doc1
|
|=>collection
|
|=>doc2
|
|=>collection
|
|=>doc3
|
|=>collection
现在我想从root_collection
获取文件清单。会有一个包含以下数据{"doc1", "doc2", "doc3"}
的列表。我需要它,因为我想创建一个微调器并将这些数据放在微调器中。然后用户将选择一些文档并下载它。
我尝试使用以下代码:
firestore.collection("root_collection")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
Log.d(TAG,document.getId() + " => " + document.getData());
}
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
但是代码只有在我没有文档集合的数据结构时工作。在其他情况下,QueryDocumentSnapshot
中没有任何文件。
谢谢!
答案 0 :(得分:2)
要获得包含root_collection
中所有文档名称的列表,请使用以下代码:
firestore.collection("root_collection").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<String> list = new ArrayList<>();
for (QueryDocumentSnapshot document : task.getResult()) {
list.add(document.getId());
}
Log.d(TAG, list.toString());
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
logcat的结果将是:
[doc1, doc2, doc3]
请记住,只有当您在这些文档中包含某些属性时,此代码才有效,否则您将以空列表结束。
答案 1 :(得分:0)
您可以调用collection方法在root_collections中获取文档,然后保存文档ID,该ID将在以后用于获取文档的收藏。
创建根集合对象为:
data class RootCollection(
@DocumentId val id: String,
val sampleField: String?
) {
// empty constructor to allow deserialization
constructor(): this(null, null)
}
然后使用FirebaseFirestore方法集合获取集合,如下所示:
val querySnapshot = firestore.collection("root_collection")
.get()
.await()
if(!querySnapshot.isEmpty) {
Result.SUCCESS(querySnapshot.toObjects(RootCollection::class.java))
} else {
Result.ERROR(Exception("No data available"))
}
然后在文档调用中获取收藏
firestore.collection("root_collection/$documentId/collection")
请注意,我已使用link
中所述的kotlin协程等待方法Result类用于保存返回数据的状态并处理错误。
sealed class Result<out T: Any> {
data class SUCCESS<out T: Any>(val data: T) : Result<T>()
data class ERROR(val e: Exception): Result<Nothing>()
object LOADING : Result<Nothing>()
}
答案 2 :(得分:-1)
好吧,我认为您现在不能执行此操作,因为Firestore无法提供有关子文档的此类了解。您的根集合只会知道其文档。
但是您可以做的是在Root集合的文档中获取对该集合的引用,然后就可以在该集合中获取这些文件。