Android Studio Firebase Firestore 无法检索字段数据

Posted

技术标签:

【中文标题】Android Studio Firebase Firestore 无法检索字段数据【英文标题】:Android studio Firebase Firestore cann't retrieve field data 【发布时间】:2022-01-12 12:19:50 【问题描述】:

我正在尝试从 firestore 中的字符串字段 group_name 检索值,但我收到 NullPointerException,因为该值没有被检索并添加到数组列表中。所以数组列表是空的。我正在尝试在 OnCreateView 中获取数据,因为我正在处理片段。添加数据非常有效(createNewGroup())。

    @Override
public void onCreate(@Nullable Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    mAuth = FirebaseAuth.getInstance();
    currentUser = mAuth.getCurrentUser();
    db = FirebaseFirestore.getInstance();
    //FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder().setPersistenceEnabled(true).setCacheSizeBytes(FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED).build();
    //db.setFirestoreSettings(settings);




    groupList = new ArrayList<>();
    gridView = view.findViewById(R.id.notes_gridview);
    //Source source = Source.CACHE;
    //https://firebase.google.com/docs/firestore/query-data/get-data#source_options
    db.collection("groups").document(key).get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() 
        @Override
        public void onSuccess(DocumentSnapshot documentSnapshot) 
            if (documentSnapshot.exists()) 
                groupList.add(documentSnapshot.getString("group_name"));
                Log.w(TAG, "DocumentSnapshot data: " + documentSnapshot.getData());
                adpter = new GroupAdapter(getActivity(), groupList);
                gridView.setAdapter(adpter);
                mProgressCircle.setVisibility(View.INVISIBLE);
             else 
                Log.w(TAG, "No such document");
            
        
    ).addOnFailureListener(new OnFailureListener() 
        @Override
        public void onFailure(@NonNull Exception e) 
            Log.w(TAG, "Error getting documents: " + e.getMessage());
        
    );

private void CreateNewGroup(String groupName) 
    HashMap<String, String> groupData = new HashMap<>();
    groupData.put("group_name", groupName);
    HashMap<String, Object> update = new HashMap<>();
    update.put(key, groupData);
    db.collection("groups").document(key).set(update).addOnSuccessListener(new OnSuccessListener<Void>() 
        @Override
        public void onSuccess(Void unused) 
            Log.w(TAG, "New group added successfully to Firestore");
            ((NavigationHost) getActivity()).navigateTo(new MyGroupsFragment(), false);
        
    ).addOnFailureListener(new OnFailureListener() 
        @Override
        public void onFailure(@NonNull Exception e) 
            Toast.makeText(getActivity(), "Failed adding new group to firestore", Toast.LENGTH_LONG).show();
        
    );

更新:

【问题讨论】:

这能回答你的问题吗? What is a NullPointerException, and how do I fix it? 你为什么要在 onCreate 中这样做?如果这是一个片段,请使用 onViewCreated 问题是“group_name”字段的值没有被添加到组列表中,所以它保持为空。这会导致 NullPointerException。所以不,这不能回答我的问题。 Oncreate 通常不是问题。 @a_local_nobody 我添加了截图以更好地解释问题 【参考方案1】:

问题似乎在于您创建的文档比您预期的嵌套程度更高,并且在文档本身中包含了文档 ID。您创建了类似这样的内容(您可以在 Firestore 屏幕截图以及您发布的日志输出中看到):

collection[docId] = docId=group_name=Test

当我认为你打算创建时

collection[docId] = group_name=Test

要解决此问题,您只需将CreateNewGroup 中的document(key).set(update) 更改为document(key).set(groupData)

Firestore docs 中有几个有用的示例说明如何设置和更新文档数据。

或者,如果这是您想要的文档结构,您需要更改检索group_name 的方式。

代替

String group = documentSnapshot.getString("group_name");

您需要这样的东西来首先检索嵌套地图,然后从中获取group_name 属性

String group = documentSnapshot.getData().get(key).get("group_name");

【讨论】:

谢谢你解决了这个问题

以上是关于Android Studio Firebase Firestore 无法检索字段数据的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio、谷歌 Firebase、谷歌地图

尝试从 Android Studio 添加 Firebase 项目时出错

Android Studio中的Firebase android jars文档/javadoc [重复]

无法在 android studio 中设置 firebase

Android Studio和Firebase中的权限被拒绝错误[重复]

从 Android Studio 中的片段将数据写入 Firebase