我正在尝试向连接到Firestore数据库的第一个基本应用程序添加一个不错的功能,在那里获取集合中所有文档的名称,并将它们存储在字符串ArrayList中。如下所示,数据库非常简单,并且包含一个名为pedestals
的集合,其中仅包含3个文档。每个文档都有4个字段(jack,jack_laser,名称和总和):
Firestore snapshot of my database
通过使用pedestals.whereEqualTo(“ name”,true).get()我猜对所有名称的查询已初始化,但是我不确定如何从中提取名称。我观看了许多youtube视频,并尝试了用于Firestore的google code-lab部分,但它们每个都用于查询文档并存储其数据-虽然在这里我不想获取所有文档,但只希望获取其名称字段的值。
这是相关的方法代码:
private void myFirsyQuary2(){
// Get a reference to the pedestal collection
final CollectionReference pedestals = mFirestore.collection("pedestals");
// get all the names of the pedestals in firestore
pedestals.whereEqualTo("name", true).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
for (QueryDocumentSnapshot document : task.getResult()) {
// names.add(document.getString("name"));
names.add(document.getData().toString());
}
String str = Arrays.toString(names.toArray());
Log.e(TAG, "god job: " +str);
Toast.makeText(FileLoading.this, "success!", Toast.LENGTH_LONG).show();
}//end of onSuccess
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(FileLoading.this, "error!", Toast.LENGTH_LONG).show();
Log.e(TAG, "could not get the query");
}
});
};
您可能会看到,我尝试实现一个for循环,该循环将每个文档快照(即使我正在查找字段而不是documentsm。这是问题吗?)存储在数组中。
在logcat终端中,我得到: 08-24 17:41:45.786 10738-10738 / benda.leveling_v2 E / MyActivity:上帝的工作:[] 这让我知道arraylist为空。
我在这里做什么错了?
答案 0 :(得分:0)
在这里,我不想获取所有文档,而只希望获取其名称字段的值。
无法从文档中仅获取name属性的值。在Coud Firestore中,没有字段级权限或对文档的访问。这是整个文档,或者什么也没有。 Firestore客户端SDK总是返回完整的文档。不幸的是,尽管服务器端SDK的select()方法中确实存在此选项,但无法通过客户端SDK仅请求文档的一部分。
此外,在使用以下代码行时:
pedestals.whereEqualTo("name", true)
这意味着您正在搜索pedestals
集合中属性name
拥有true
值的每个文档。由于该属性包含一个String且 not 一个布尔值,因此没有可以返回的结果。可能的查询是:
pedestals.whereEqualTo("name", "site3")
它将在屏幕快照中返回第三个文档。如果要获取name
属性或文档ID,请使用以下代码行:
pedestals.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.getString("name"));
Map<String, Object> map = document.getData();
}
}
}
});
如果要获取这些数组,请注意,即使在数据库中那些属性为array
类型,当您获取它们时,对象也为List
类型。另一种解决方案可能是遍历map
并获取相应的值。