由于Intent.PutExtra将Firebase节点发送到另一个活动进行编辑,导致应用程序在删除后崩溃

时间:2018-10-29 19:09:20

标签: java android firebase firebase-realtime-database

我创建了两种删除帖子和编辑帖子的方法。我能够成功执行这两项工作。所有帖子都可以删除。我创建了一个编辑按钮,将用户带到撰写写作后的文本编辑活动(清理)中,同时将要编辑的任务的所有信息都检索到文本编辑框中。所有编辑也都完成了成功。仅当用户尝试删除编辑的任务后,才会出现此问题。该应用程序直接崩溃,并说了一些put-extra方法,该方法将正在编辑的帖子的键发送到另一个类,以填充编辑文本框。用户未编辑并仅添加的帖子将被删除,没有任何问题。它只是被编辑的帖子使应用程序崩溃,即使这些帖子即使在崩溃后也会从firebase数据库中删除...

我希望我的问题有道理 下面是我的代码

public class MyPosts extends AppCompatActivity {

    private static final String TAG = "MyPosts";

    Toolbar toolbar;
    DatabaseReference WorkingData;
    DatabaseReference WorkingDataForDeletion;
    DatabaseReference tasks;

    private BottomNavigationView navigationView;
    RecyclerView recyclerView;
    ArrayList<WorkInformation> workList;

    private AppCompatButton deletePost;
    private AppCompatButton editPost;
    String currentUserID, postKey;
    private FirebaseAuth firebaseAuth;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_posts);

        toolbar = (Toolbar) findViewById(R.id.my_post_toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle("My Posts");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        navigationView = findViewById(R.id.bottomNavigationView);
        firebaseAuth = FirebaseAuth.getInstance();

        currentUserID = firebaseAuth.getCurrentUser().getUid();
        WorkingData = FirebaseDatabase.getInstance().getReference().child("UserIndividualTasks");
        WorkingData.keepSynced(true);

        recyclerView = findViewById(R.id.my_post_recycler_view);
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setReverseLayout(true);
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(linearLayoutManager);

        deletePost = findViewById(R.id.myPostDelete);
        editPost = findViewById(R.id.myPostEdit);

    }
      @Override
    protected void onStart() {
        super.onStart();


    }


    @Override
    protected void onResume() {
        super.onResume();



        Query query = WorkingData.child(FirebaseAuth.getInstance().getCurrentUser().getUid());
        FirebaseRecyclerOptions<WorkInformation> options = new FirebaseRecyclerOptions.Builder<WorkInformation>()
                .setQuery(query, WorkInformation.class)
                .build();


        final FirebaseRecyclerAdapter<WorkInformation, MyViewHolder> adapter = new FirebaseRecyclerAdapter<WorkInformation, MyViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull final MyViewHolder holder, int position, @NonNull final WorkInformation model) {


                holder.title.setText(model.getWorkTitle());
                holder.date.setText(model.getWorkDueDate());
                Picasso.get().load(model.getImg()).into(holder.imageView);


                holder.deleteBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        postKey = getRef(holder.getAdapterPosition()).getKey();
                        deleteUserPost();

                    }
                });

                holder.editBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        postKey = getRef(holder.getAdapterPosition()).getKey();
                        Intent goToCleaningForEditPost = new Intent(MyPosts.this, Cleaning.class);
                        Bundle bundle = new Bundle();
                        bundle.putString("PostKey", postKey);
                        goToCleaningForEditPost.putExtras(bundle);
                        startActivity(goToCleaningForEditPost);
                    }
                });

            }

            @NonNull
            @Override
            public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_posts_individual_row_layout, parent, false);
                MyViewHolder viewHolder = new MyViewHolder(view);
                return viewHolder;
            }
        };

        recyclerView.setAdapter(adapter);
        adapter.startListening();


    }


    public static class MyViewHolder extends RecyclerView.ViewHolder {

        public AppCompatTextView title;
        public AppCompatTextView date;
        public CircleImageView imageView;
        public AppCompatButton deleteBtn;
        public AppCompatButton editBtn;
        public ConstraintLayout constraintLayout;

        public MyViewHolder(View itemView) {
            super(itemView);

            title = itemView.findViewById(R.id.my_posts_title);
            date = itemView.findViewById(R.id.myPostDate);
            imageView = itemView.findViewById(R.id.UserImage);
            deleteBtn = itemView.findViewById(R.id.myPostDelete);
            editBtn = itemView.findViewById(R.id.myPostEdit);
        }
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id) {
            case android.R.id.home:
                startActivity(new Intent(MyPosts.this, Services.class));
                break;
        }


        return super.onOptionsItemSelected(item);
    }



      private void deleteUserPost() {
        WorkingDataForDeletion = FirebaseDatabase.getInstance().getReference().child("UserIndividualTasks")
                .child(currentUserID)
                .child(postKey);
        WorkingDataForDeletion.removeValue();


        tasks = FirebaseDatabase.getInstance().getReference().child("Tasks").child(postKey);
        tasks.removeValue();

    }

}

这是Iam现在发送用于编辑帖子的键的课程

    public class Cleaning extends AppCompatActivity implements DatePickerDialog.OnDateSetListener {
    private static final String TAG = "Cleaning";


    private BottomNavigationView navigationView;

    DatabaseReference UsersRef, WorkingData, userIndividualPostHistory;

    public static final int ERROR_DIALOG_REQUEST = 9001;
    ConstraintLayout constraintLayout;
    Toolbar toolbar;
    AppCompatEditText title;
    AppCompatEditText description;
    ElegantNumberButton budget;
    AppCompatTextView total;
    AppCompatEditText date;
    private String currentUserID, image, userNameForPost, saveDateForTask, saveTimeForTask, postRandomName, PostKey;
    AppCompatEditText places;
    private FirebaseAuth firebaseAuth;
    AppCompatButton continueservices;
    ElegantNumberButton WorkForce;
    private final static int MY_PERMISSION_FINE_LOCATION = 101;
    private final static int PLACE_PICKER_REQUEST = 1;
    double finalBudget, finalBudget2;
    private ProgressDialog loadingBar;
    private DatabaseReference WorkingDataForEdit, WorkingDataForPostEdit;

    Bundle bundle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cleaning);
        toolbar = findViewById(R.id.CleaningToolBar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle("Cleaning service");

        navigationView = findViewById(R.id.bottomNavigationView);
        navigationView.setSelectedItemId(R.id.Services);
        firebaseAuth = FirebaseAuth.getInstance();

        currentUserID = firebaseAuth.getCurrentUser().getUid();
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        constraintLayout = findViewById(R.id.cleaningConstraintLayout);
        UsersRef = FirebaseDatabase.getInstance().getReference().child("Users");
        WorkingData = FirebaseDatabase.getInstance().getReference("Tasks");
        userIndividualPostHistory = FirebaseDatabase.getInstance().getReference("UserIndividualTasks");

        loadingBar = new ProgressDialog(this);

        title = findViewById(R.id.TaskTitle);
        description = findViewById(R.id.TaskDescription);
        budget = findViewById(R.id.TaskBudget);
        total = findViewById(R.id.tasktotal);


        date = findViewById(R.id.datepickerr);
        date.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment datepicker = new DatePickerFragment();
                datepicker.show(getSupportFragmentManager(), "Select Date");

            }
        });

        requestPermission();


        places = findViewById(R.id.locationPicker);
        places.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
                try {
                    Log.d(TAG, "onClick: asking permission 3");
                    Intent intent = builder.build(Cleaning.this);
                    Log.d(TAG, "onClick: asking permission 4");
                    startActivityForResult(intent, PLACE_PICKER_REQUEST);
                } catch (GooglePlayServicesRepairableException e) {
                    e.printStackTrace();
                } catch (GooglePlayServicesNotAvailableException e) {
                    e.printStackTrace();
                }
            }
        });
    UsersRef.child(currentUserID).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {

                    if (dataSnapshot.hasChild("profileimage")) {
                        image = dataSnapshot.child("profileimage").getValue().toString();
                        userNameForPost = dataSnapshot.child("First Name").getValue().toString();

                    } else {
                        Toast.makeText(Cleaning.this, "Profile name do not exists...", Toast.LENGTH_SHORT).show();
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        continueservices = findViewById(R.id.ContinueServicesButton);
        continueservices.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (PostKey != null) {
                    editIfAlreadyExist();
                    bundle = null;
                } else {
                    addWorkingTask();
                }

            }
        });


        WorkForce = findViewById(R.id.workforce);

        WorkForce.setOnClickListener(new ElegantNumberButton.OnClickListener() {
            @Override
            public void onClick(View view) {

                finalBudget = Double.parseDouble(WorkForce.getNumber());
                finalBudget2 = Double.parseDouble(budget.getNumber());
                finalBudget = finalBudget * finalBudget2;
                total.setText(String.valueOf(finalBudget) + " BD ");
            }
        });


        budget.setOnClickListener(new ElegantNumberButton.OnClickListener() {
            @Override
            public void onClick(View view) {
                finalBudget2 = Double.parseDouble(budget.getNumber());
                finalBudget = Double.parseDouble(WorkForce.getNumber());
                finalBudget2 = finalBudget2 * finalBudget;

                total.setText(String.valueOf(finalBudget2) + " BD ");

            }
        });

     navigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                int id = item.getItemId();
                switch (id) {
                    case R.id.Services:
                        break;
                    case R.id.Search:
                        startActivity(new Intent(Cleaning.this, Search.class));
                        break;
                    case R.id.Task:
                        break;
                    case R.id.Message:
                        break;
                    case R.id.Settings:
                        startActivity(new Intent(Cleaning.this, UserProfile.class));
                        break;
                }


                return false;
            }
        });




        bundle = getIntent().getExtras();
        if (bundle != null) {
            PostKey = bundle.get("PostKey").toString();
            WorkingDataForEdit = FirebaseDatabase.getInstance().getReference().child("UserIndividualTasks").child(currentUserID).child(PostKey);
            WorkingDataForPostEdit = FirebaseDatabase.getInstance().getReference().child("Tasks").child(PostKey);

        }


        if (PostKey != null) {
            WorkingDataForEdit.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

//Error occurred here line @239

  String mtitle = dataSnapshot.child("workTitle").getValue().toString();
                    String mdescription = 
   dataSnapshot.child("workDescription").getValue().toString();
                    String mdate = 
  dataSnapshot.child("workDueDate").getValue().toString();
                    String mlocation = 
     dataSnapshot.child("workLocation").getValue().toString();
                    String mMen = 
   dataSnapshot.child("workForce").getValue().toString();
                    String mbudget =  
    dataSnapshot.child("workBudget").getValue().toString();
                    String mtotal = 
   dataSnapshot.child("total").getValue().toString();

                    title.setText(mtitle);
                    description.setText(mdescription);
                    date.setText(mdate);
                    places.setText(mlocation);
                    WorkForce.setNumber(mMen);
                    budget.setNumber(mbudget);
                    total.setText(mtotal);


                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
        }


    }

    private void editIfAlreadyExist() {
        WorkingDataForEdit.child("workTitle").setValue(title.getText().toString());
        WorkingDataForEdit.child("workDescription").setValue(description.getText().toString());
        WorkingDataForEdit.child("workDueDate").setValue(date.getText().toString());
        WorkingDataForEdit.child("workLocation").setValue(places.getText().toString());
        WorkingDataForEdit.child("workForce").setValue(WorkForce.getNumber());
        WorkingDataForEdit.child("workBudget").setValue(budget.getNumber());
        WorkingDataForEdit.child("total").setValue(total.getText().toString());


        WorkingDataForPostEdit.child("workTitle").setValue(title.getText().toString());
        WorkingDataForPostEdit.child("workDescription").setValue(description.getText().toString());
        WorkingDataForPostEdit.child("workDueDate").setValue(date.getText().toString());
        WorkingDataForPostEdit.child("workLocation").setValue(places.getText().toString());
        WorkingDataForPostEdit.child("workForce").setValue(WorkForce.getNumber());
        WorkingDataForPostEdit.child("workBudget").setValue(budget.getNumber());
        WorkingDataForPostEdit.child("total").setValue(total.getText().toString());

        startActivity(new Intent(Cleaning.this, Search.class));


    }

     private void requestPermission() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSION_FINE_LOCATION);
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {
            case MY_PERMISSION_FINE_LOCATION:
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(getApplicationContext(), "This app requires location permissions to be granted", Toast.LENGTH_LONG).show();
                    finish();
                }
                break;
        }
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d(TAG, "onActivityResult: asking permission 2");
        if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == RESULT_OK) {
                Place place = PlacePicker.getPlace(Cleaning.this, data);
                places.setText(place.getName() + " " + place.getAddress());

            }
        }
    }

    private void addWorkingTask() {

        loadingBar.setMessage("Posting task.Please Wait....");
        loadingBar.show();
        loadingBar.setCanceledOnTouchOutside(true);

     Calendar callForTime = Calendar.getInstance();
        SimpleDateFormat currentTime = new SimpleDateFormat("HH:mm:ss");
        saveTimeForTask = currentTime.format(callForTime.getTime());

     Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy, HH:mm");
        String currentDateandTime = sdf.format(d);


        String taskTitle = title.getText().toString();
        String taskDescription = description.getText().toString();
        String date = this.date.getText().toString();
        String location = places.getText().toString();
        String workMen = WorkForce.getNumber();
        String budget = this.budget.getNumber();
        String total = this.total.getText().toString();

        if (!TextUtils.isEmpty(taskTitle)) {
            if (!TextUtils.isEmpty(taskDescription)) {
                if (!TextUtils.isEmpty(date)) {
                    if (!TextUtils.isEmpty(location)) {
                        String id = WorkingData.push().getKey();
                        WorkInformation workInformation = new WorkInformation(id, taskTitle, taskDescription
                                , date, location, workMen
                                , budget
                                , total, image
                                , currentUserID
                                , userNameForPost, currentDateandTime, saveTimeForTask);

                        WorkingData.child(id).setValue(workInformation);

                        userIndividualPostHistory.child(currentUserID).child(id).setValue(workInformation);

                        Toast.makeText(this, "Work Information saved", Toast.LENGTH_SHORT).show();
                        loadingBar.dismiss();
                        startActivity(new Intent(Cleaning.this, Search.class));


                    } else {
                        Toast.makeText(this, "Something is missing", Toast.LENGTH_SHORT).show();
                        loadingBar.dismiss();
                    }
                }

            }
        }

    }


    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month);
        calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
        String currentDateString = DateFormat.getDateInstance(DateFormat.FULL).format(calendar.getTime());
        date.setText(currentDateString);

    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id) {
            case android.R.id.home:
                finish();
                break;
        }


        return super.onOptionsItemSelected(item);
    }
}
  

错误:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.saqib.smarttaskk, PID: 13977
              java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
                  at com.example.saqib.smarttaskk.Cleaning$8.onDataChange(Cleaning.java:239)
                  at com.google.firebase.database.obfuscated.zzap.zza(com.google.firebase:firebase-database@@16.0.2:75)
                  at com.google.firebase.database.obfuscated.zzca.zza(com.google.firebase:firebase-database@@16.0.2:63)
                  at com.google.firebase.database.obfuscated.zzcd$1.run(com.google.firebase:firebase-database@@16.0.2:55)
                  at android.os.Handler.handleCallback(Handler.java:789)
                  at android.os.Handler.dispatchMessage(Handler.java:98)
                  at android.os.Looper.loop(Looper.java:164)
                  at android.app.ActivityThread.main(ActivityThread.java:6938)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

应用程序终止。

1 个答案:

答案 0 :(得分:0)

发生错误是因为没有这样的子workTitle,或者如果它存在,则说明Firebase数据库中该节点下没有数据。建议您检查值是否不为空。

Object title = dataSnapshot.child("workTitle").getValue();
if(title != null)
{
 String mtitle = title.toString();
}