first user give input sub,classAttended,Total class in other activity then i store in database and then i show data on recycler view with the help of list the i want when user click on +/- then that subject attendance increase by 1 and also total class by 1 but my app get crash when i click on that +/-btn
RecVIewAdapter
public class recViewAdapter extends RecyclerView.Adapter<recViewAdapter.viewHolder> {
private Context mContext;
MyHelper helper = new MyHelper(mContext);
List<SubjectModel> list;
public recViewAdapter(List<SubjectModel> list) {
this.list = list;
notifyDataSetChanged();
}
@NonNull
@Override
public viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_recview, parent, false);
return new viewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final viewHolder holder, final int position) {
holder.subject.setText(list.get(position).getSubject());
holder.classesAttended.setText(list.get(position).getClassesAttended());
holder.totalClasses.setText("/" + list.get(position).getTotalClasses());
String result = String.valueOf(Integer.valueOf(list.get(position).getClassesAttended()) * 100 / Integer.valueOf(list.get(position).getTotalClasses()));
holder.attendancePercentage.setText(result + "%");
holder.presentBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int cl_attended=0,t_classes=0;
cl_attended = Integer.parseInt(String.valueOf(list.get(position).getClassesAttended()));
t_classes = Integer.parseInt(String.valueOf(list.get(position).getTotalClasses()));
cl_attended++;
t_classes++;
helper.updateData(list.get(position).getId(),String.valueOf(cl_attended),String.valueOf(t_classes));
notifyDataSetChanged();
}
});
holder.absentBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class viewHolder extends RecyclerView.ViewHolder {
private TextView subject, classesAttended, totalClasses, attendancePercentage;
private ImageView presentBtn, absentBtn;
public viewHolder(@NonNull final View itemView) {
super(itemView);
subject = itemView.findViewById(R.id.subject);
classesAttended = itemView.findViewById(R.id.class_attended);
totalClasses = itemView.findViewById(R.id.total_clases);
attendancePercentage = itemView.findViewById(R.id.attendance_percentage);
presentBtn = itemView.findViewById(R.id.present);
absentBtn = itemView.findViewById(R.id.absent);
}
}
}
Databasehelper
public class MyHelper extends SQLiteOpenHelper {
private static final String dbname = "mydb";
private static final int version = 1;
private Context context;
public MyHelper(Context context){
super(context,dbname,null,version);
}
@Override
public void onCreate(SQLiteDatabase db) {
String query="CREATE TABLE IF NOT EXISTS STUDENTS_DETAILS (ID INTEGER PRIMARY KEY AUTOINCREMENT, SUB_NAME TEXT ,CLASS_ATTENDED INT ,TOTAL_CLASSES INT)";
db.execSQL(query);
}
public boolean insertData(String subject, String class_attended, String total_classes){
SQLiteDatabase database=this.getWritableDatabase();
ContentValues values =new ContentValues();
values.put("SUB_NAME",subject);
values.put("CLASS_ATTENDED",class_attended);
values.put("TOTAL_CLASSES",total_classes);
long result =database.insert("STUDENTS_DETAILS",null,values);
if(result == -1) return false;
else return true;
}
public Cursor getData(){
String query ="SELECT * FROM STUDENTS_DETAILS";
SQLiteDatabase database =this.getReadableDatabase();
Cursor cursor = null;
if(database != null){
cursor =database.rawQuery(query,null);
}
return cursor;
};
public void updateData(String id,String classAttended,String totalClasses){
SQLiteDatabase database =this.getWritableDatabase();
ContentValues values =new ContentValues();
values.put("CLASS_ATTENDED",classAttended);
values.put("TOTAL_CLASSES",totalClasses);
long result =database.update("STUDENTS_DETAILS",values,"ID=?",new String[]{id} );
if(result == -1){
Toast.makeText(context, "Succesfully Updated", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(context, "failed in update data", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
MY list item*image of my list item +/- is present/absent btn and 25/30 is classAttended/totalClasses
my app get crash when i click on present btn Error-- on click presentBtn then the data is not updated in database and updateData is not called why updateData of databaseHelper is not invoke pls tell that
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.attendancemanager, PID: 11059
java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getDatabasePath(java.lang.String)' on a null object reference
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:371)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:317)
at com.example.attendancemanager.MyHelper.updateData(MyHelper.java:74)
at com.example.attendancemanager.recViewAdapter$viewHolder$1.onClick(recViewAdapter.java:92)
at android.view.View.performClick(View.java:7256)
at android.view.View.performClickInternal(View.java:7218)
at android.view.View.access$3800(View.java:824)
at android.view.View$PerformClick.run(View.java:27719)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:228)
at android.app.ActivityThread.main(ActivityThread.java:7782)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:981)