【问题标题】:Firestore returning null object referenceFirestore 返回空对象引用
【发布时间】:2021-08-27 01:00:02
【问题描述】:

当我尝试访问“EventDetail”活动时,应用程序不断返回到 MainActivity。当我添加 joinBtn.setOnClickListener 并根据给出的建议根据之前的帖子进行修改时会发生这种情况:Is there a method can be used to modify particular document in Firestore when user click on a card?

这里有人可以帮我解决这个问题吗?提前谢谢你。

public class EventDetail extends AppCompatActivity {
    private static final String TAG = "DetailActivity";

    EventModel event;

    private TextView textViewEName, textViewEVenue, textViewEDate, textViewEDesc;
    private Button joinBtn;

    private FirebaseFirestore fStore;
    private FirebaseUser user;
    private FirebaseAuth fAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_detail);
        Log.d(TAG, "onCreate: Started.");

        fStore = FirebaseFirestore.getInstance();
        user= FirebaseAuth.getInstance().getCurrentUser();


        textViewEName = (TextView)findViewById(R.id.textEventNameDetail);
        textViewEDate = (TextView)findViewById(R.id.textEventDateDetail);
        textViewEVenue = (TextView)findViewById(R.id.textEventVenueDetail);
        textViewEDesc = (TextView)findViewById(R.id.textEventDescDetail);
        joinBtn=findViewById(R.id.joinBtn);

        textViewEName.setText(getIntent().getStringExtra("eventName").toString());
        textViewEDate.setText(getIntent().getStringExtra("eventDate").toString());
        textViewEVenue.setText(getIntent().getStringExtra("eventVenue").toString());
        textViewEDesc.setText(getIntent().getStringExtra("eventDesc").toString());


        //When particular event card is click
        joinBtn.setOnClickListener(new View.OnClickListener() {

            //Make addEvent object 'a' to access variable in addEvent
            AddEvent a = new AddEvent();
            @Override
            public void onClick(View v) {
                FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
                CollectionReference collRef= rootRef.collection("users");

                Map<String, Object> update = new HashMap<>();
                update.put("eventDocId", a.eventDocId);
  
                DocumentReference docId = collRef.document(user.getUid());
                docId.update("saved_event", update).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull @NotNull Task<Void> task) {
                        Log.d(TAG, "Update complete.");
                    }
                });
                
            }
        });
    }
}

我添加这段代码后出现错误。

joinBtn.setOnClickListener(new View.OnClickListener() {

            //Make addEvent object 'a' to access variable in addEvent
            AddEvent a = new AddEvent();
            @Override
            public void onClick(View v) {
                FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
                CollectionReference collRef= rootRef.collection("users");

                Map<String, Object> update = new HashMap<>();
                update.put("eventDocId", a.eventDocId);
  
                DocumentReference docId = collRef.document(user.getUid());
                docId.update("saved_event", update).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull @NotNull Task<Void> task) {
                        Log.d(TAG, "Update complete.");
                    }
                });
                
            }
        });

当我检查 logcat 时,出现这个错误:

2021-08-27 08:24:40.590 18531-18531/com.example.myvolunteer E/AndroidRuntime: 致命异常: main 进程:com.example.myvolunteer,PID:18531 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.myvolunteer/com.example.myvolunteer.EventDetail}:java.lang.NullPointerException:尝试调用虚拟方法 'com.google.firebase.firestore.CollectionReference com。 google.firebase.firestore.FirebaseFirestore.collection(java.lang.String)' 在空对象引用上 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3792) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3968) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:246) 在 android.app.ActivityThread.main(ActivityThread.java:8512) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1139) 引起:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'com.google.firebase.firestore.CollectionReference com.google.firebase.firestore.FirebaseFirestore.collection(java.lang.String)' 在 com.example.myvolunteer.AddEvent.(AddEvent.java:40) 在 com.example.myvolunteer.EventDetail$1.(EventDetail.java:63) 在 com.example.myvolunteer.EventDetail.onCreate(EventDetail.java:61) 在 android.app.Activity.performCreate(Activity.java:8198) 在 android.app.Activity.performCreate(Activity.java:8182) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3765)

【问题讨论】:

  • 我认为您尝试更新的文档在 Firestore 数据库中不存在。
  • onComplete 中您是否添加了这样的if 语句:if(task.isSuccesfull) 然后在成功和失败时执行您的操作。
  • @VaibhavGoyal 请参考我附上的db结构图。
  • @VishalBeep 我刚刚试了一下,还是一样。
  • 您在哪一行代码中遇到了 NullPointerException?

标签: java android firebase google-cloud-firestore


【解决方案1】:

你可以试试这个代码

 docId.update("saved_event", update).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull @NotNull Task<Void> task) {
                    if(task.isSuccessful())
                      Log.d(TAG, "Update complete.");
                    else
                      Log.d(TAG, "Something went wrong : "+task.getException());
                }
            });

【讨论】:

  • 问题依然存在
猜你喜欢
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
相关资源
最近更新 更多