Android(Kotlin)中如何获取Firestore跨集合关联的数组数据?
如何在Kotlin中获取Firebase Auth登录Manager的所有Turf详情
根据你的数据结构,有两种高效的实现方式,以下是具体代码和说明:
方案一:利用Turf文档的manager_id字段直接查询(推荐)
这种方式无需先查询Manager文档,直接通过turfs集合的manager_id字段过滤,是最简洁高效的实现方式:
import com.google.firebase.auth.FirebaseAuth import com.google.firebase.firestore.FirebaseFirestore import kotlinx.coroutines.tasks.await // 获取当前登录Manager的UID val currentManagerUid = FirebaseAuth.getInstance().currentUser?.uid ?: return // 初始化Firestore实例 val db = FirebaseFirestore.getInstance() // 回调方式实现 db.collection("turfs") .whereEqualTo("manager_id", currentManagerUid) .get() .addOnSuccessListener { querySnapshot -> val turfsList = mutableListOf<Turf>() for (document in querySnapshot) { val turf = document.toObject(Turf::class.java) turfsList.add(turf) } // 在此处处理获取到的Turf列表(如更新UI) } .addOnFailureListener { exception -> // 处理查询失败逻辑 exception.printStackTrace() } // Coroutines方式(推荐在ViewModel/Repository中使用) suspend fun getCurrentManagerTurfs(): List<Turf>? { return try { val currentManagerUid = FirebaseAuth.getInstance().currentUser?.uid ?: return null val querySnapshot = db.collection("turfs") .whereEqualTo("manager_id", currentManagerUid) .get() .await() querySnapshot.toObjects(Turf::class.java) } catch (e: Exception) { e.printStackTrace() null } }
方案二:通过Manager文档的turfs_owned数组查询
如果需要基于turfs_owned数组获取Turf数据,可先查询Manager文档拿到UID列表,再用whereIn查询turfs集合:
import com.google.firebase.auth.FirebaseAuth import com.google.firebase.firestore.FieldPath import com.google.firebase.firestore.FirebaseFirestore import kotlinx.coroutines.tasks.await // 初始化Firestore实例 val db = FirebaseFirestore.getInstance() // Coroutines方式实现 suspend fun getCurrentManagerTurfsFromOwnedList(): List<Turf>? { return try { val currentManagerUid = FirebaseAuth.getInstance().currentUser?.uid ?: return null // 第一步:获取当前Manager的turfs_owned数组 val managerDoc = db.collection("manager").document(currentManagerUid).get().await() val turfsOwnedUids = managerDoc.get("turfs_owned") as? List<String> ?: emptyList() if (turfsOwnedUids.isEmpty()) return emptyList() // 第二步:查询turfs集合中UID在列表内的文档 // 注意:Firestore的whereIn最多支持10个元素,超过需分批查询 val querySnapshot = db.collection("turfs") .whereIn(FieldPath.documentId(), turfsOwnedUids) .get() .await() querySnapshot.toObjects(Turf::class.java) } catch (e: Exception) { e.printStackTrace() null } }
关键注意事项
- 权限配置:必须在Firestore安全规则中限制访问,确保用户仅能读取自己的Turf数据,示例规则:
match /turfs/{turfId} { allow read: if request.auth != null && resource.data.manager_id == request.auth.uid; } - 数据类定义:需定义
Turf数据类映射Firestore文档,示例:data class Turf( val manager_id: String = "", val name: String = "", val location: String = "" // 其他Turf字段按需添加 ) - whereIn限制:方案二中
whereIn最多支持10个元素,若turfs_owned数组长度超过10,需拆分列表分批查询后合并结果。
内容的提问来源于stack exchange,提问作者Soumil Jaiswal
相关产品推荐
相关产品推荐

