When I open FavActivity, then App crashes. Information from crash reports.
Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.database.sqlite.SQLiteOpenHelper.getReadableDatabase()' on a null object reference
com.dic.FavActivity.loadData (FavActivity.java:9)
MainActivity
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerViewId);
itemList = new ArrayList<>();
itemAdapter = new ItemAdapter(this,itemList);
itemList.add(new NamesModel("0","name1","meaning","0"));
itemList.add(new NamesModel("1","name2","meaning","0"));
itemList.add(new NamesModel("2","name3","meaning","0"));
itemList.add(new NamesModel("3","name4","meaning","0"));
linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setAdapter(duaNamesAdapter);
recyclerView.setLayoutManager(linearLayoutManager);
ItemAdapter
Context context;
List<ItemModel> itemList;
private FavDB favDB;
public ItemAdapter(Context context, List<ItemModel> itemList) {
this.context = context;
this.itemList= itemList;
}
@NonNull
@Override
public NamesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
FavDB = new FavDB(context);
//create table on first
SharedPreferences prefs = context.getSharedPreferences("prefs", Context.MODE_PRIVATE);
boolean firstStart = prefs.getBoolean("firstStart", true);
if (firstStart) {
createTableOnFirstStart();
}
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.names_item,parent, false );
return new DuaNamesViewHolder(view);
}
@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(@NonNull NamesViewHolder holder, int position) {
final NamesModel namesModel = itemList.get(position);
readCursorData(namesModel, holder);
holder.name.setText(itemList.get(position).getName());
holder.meaning.setText(itemList.get(position).getMeaning());
}
@Override
public int getItemCount() {
return itemList.size();
}
public class NamesViewHolder extends RecyclerView.ViewHolder{
TextView name,meaning;
ImageView addFav;
public NamesViewHolder(View itemView) {
super(itemView);
name = itemView.findViewById(R.id.tv_name);
meaning = itemView.findViewById(R.id.tv_meaning);
addFav = itemView.findViewById(R.id.addFav);
addFav.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = getAbsoluteAdapterPosition();
ItemModel itemModel = itemList.get(position);
if (itemModel .getFavStatus().equals("0")) {
itemModel .setFavStatus("1");
favDB.insertIntoTheDatabase(itemModel.getId(), itemModel.getName(), itemModel.getMeaning(), itemModel.getFavStatus());
addFav.setBackgroundResource(R.drawable.baseline_favorite_24);
}else {
itemModel.setFavStatus("0");
favDB.remove_fav(itemModel.getId());
addFav.setBackgroundResource(R.drawable.baseline_favorite_border_24);
}
}
});
}
}
private void createTableOnFirstStart() {
favDB.insertEmpty();
SharedPreferences prefs = context.getSharedPreferences("prefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("firstStart", false);
editor.apply();
}
private void readCursorData(@NonNull ItemModel itemModel, NamesViewHolder viewHolder) {
Cursor cursor = favDB.read_all_data(itemModel.getId());
SQLiteDatabase db = favDB.getReadableDatabase();
try {
while (cursor.moveToNext()) {
String status = cursor.getString(cursor.getColumnIndex(FavDB.STATUS));
itemModel.setFavStatus(status);
//check fav status
if (status != null && status.equals("1")) {
viewHolder.addFav.setBackgroundResource(R.drawable.baseline_favorite_24);
} else if (status != null && status.equals("0")) {
viewHolder.addFav.setBackgroundResource(R.drawable.baseline_favorite_border_24);
}
}
} finally {
if (cursor != null && cursor.isClosed())
cursor.close();
}
}
FavActivity
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerViewId);
linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
loadData();
}
private void loadData() {
if (favItemlList != null) {
favItemlList.clear();
}
db = favDB.getReadableDatabase();
cursor = favDB.select_all_favorite_list();
try {
while (cursor.moveToNext()) {
String id = cursor.getString(cursor.getColumnIndex(FavDB.ID));
String name = cursor.getString(cursor.getColumnIndex(FavDB.NAME));
String meaning = cursor.getString(cursor.getColumnIndex(FavDB.MEANING));
FavModel favModel = new FavModel(id, name, meaning);
favItemlList.add(favModel);
}
} finally {
if (cursor != null && cursor.isClosed())
cursor.close();
}
favItemlList = new ArrayList<>();
favAdapter = new FavAdapter(this, favItemlList);
recyclerView.setAdapter(favAdapter);
}
FavAdapter
private Context context;
private List<FavModel> favItemList;
private FavDB favDB;
private DatabaseReference refLike;
public FavAdapter(Context context, List<FavModel> favItemList) {
this.context = context;
this.favItemList = favItemList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.names_item_fav,
parent, false);
favDB = new FavDB(context);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.name.setText(favItemList.get(position).getName());
holder.meaning.setText(favItemList.get(position).getMeaning());
}
@Override
public int getItemCount() {
return favItemList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView name,meaning;
ImageView addFav;
public ViewHolder(@NonNull View itemView) {
super(itemView);
name = itemView.findViewById(R.id.tv_Name);
meaning = itemView.findViewById(R.id.tv_Meaning);
addFav = itemView.findViewById(R.id.addFav);
refLike = FirebaseDatabase.getInstance().getReference().child("likes");
//remove from fav after click
addFav.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = getAbsoluteAdapterPosition();
final FavModel favItem = favItemList.get(position);
final DatabaseReference upvotesRefLike = refLike.child(favItemList.get(position).getId());
favDB.remove_fav(favItem.getId());
removeItem(position);
upvotesRefLike.runTransaction(new Transaction.Handler() {
@NonNull
@Override
public Transaction.Result doTransaction(@NonNull final MutableData mutableData) {
try {
Integer currentValue = mutableData.getValue(Integer.class);
if (currentValue == null) {
mutableData.setValue(1);
} else {
mutableData.setValue(currentValue - 1);
}
} catch (Exception e) {
throw e;
}
return Transaction.success(mutableData);
}
@Override
public void onComplete(@Nullable DatabaseError databaseError, boolean b, @Nullable DataSnapshot dataSnapshot) {
System.out.println("Transaction completed");
}
});
}
});
}
private void removeItem(int position) {
favItemList.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position,favItemList.size());
}
}
FavDB
public class FavDB extends SQLiteOpenHelper {
private static int DB_VERSION = 1;
private static String DATABASE_NAME = "DuaNamesDB";
private static String TABLE_NAME = "favoriteTable";
public static String ID = "id";
public static String NAME = "itemName";
public static String MEANING = "itemMeaning";
public static String STATUS = "fStatus";
// dont forget write this spaces
private static String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "("
+ ID + " TEXT," + NAME + " TEXT," + MEANING+ " TEXT," + STATUS+" TEXT)";
public FavDB(Context context) { super(context,DATABASE_NAME,null,DB_VERSION);}
@Override
public void onCreate(@NonNull SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
// create empty table
public void insertEmpty() {
try (SQLiteDatabase db = this.getWritableDatabase()) {
ContentValues cv = new ContentValues();
// enter your value
for (int x = 1; x < 25; x++) {
cv.put(ID, x);
cv.put(STATUS, "0");
db.insert(TABLE_NAME, null, cv);
}
}
}
// insert data into database
public void insertIntoTheDatabase(String id, String item_name, String item_meaning, String fav_status) {
SQLiteDatabase db;
db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(ID, id);
cv.put(NAME, item_name);
cv.put(ARB, item_meaning);
cv.put(STATUS, fav_status);
db.insert(TABLE_NAME,null, cv);
Log.d("FavDB Status", item_name + ", favstatus - "+fav_status+" - . " + cv);
}
// read all data
public Cursor read_all_data(String id) {
SQLiteDatabase db = this.getReadableDatabase();
String sql = "select * from " + TABLE_NAME + " where " + ID+"="+id+"";
return db.rawQuery(sql,null,null);
}
// remove line from database
public void remove_fav(@NonNull String id) {
SQLiteDatabase db = this.getWritableDatabase();
String sql = "UPDATE " + TABLE_NAME + " SET "+ STATUS+" ='0' WHERE "+ID+"="+id+"";
db.execSQL(sql);
Log.d("remove", id.toString());
}
// select all favorite list
public Cursor select_all_favorite_list() {
SQLiteDatabase db = this.getReadableDatabase();
String sql = "SELECT * FROM "+TABLE_NAME+" WHERE "+STATUS+" ='1'";
return db.rawQuery(sql,null,null);
}
}
** Please anyone help me. Thanks In advance.**
Fatal Exception: java.lang.RuntimeException Unable to start activity ComponentInfo{com.dic/com.dic.FavActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.database.sqlite.SQLiteOpenHelper.getReadableDatabase()' on a null object reference