Wpis z mikrobloga

#androiddev #programowanie #sqlite
Piszę malutką apkę używającą SQLite, z którego dane wyświetlać ma RecyclerView, ale mam problem, bo wyskakuje mi komunikat: TaskDBHelper.getAllItems()' on a null object reference.
Jest to moje pierwsze zetknięcie z SQLite, więc za Chiny ludowe nie mam pojęcia gdzie zrobiłem błąd.

Rzeczona metoda:
public Cursor getAllItems() {
return mDatabase.query(
TaskContract.TaskEntry.TABLENAME,
null,
null,
null,
null,
null,
TaskEntry.COLUMN
DATE + "DESC"
);
}

Wywołanie w onCreate:
RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
mMainAdapter = new MainAdapter(this, mTaskDBHelper.getAllItems());
recyclerView.setAdapter(mMainAdapter);
  • 17
@DanielAquarius:
Adapter:
MainAdapter(Context context, Cursor cursor) {
mContext = context;
mCursor = cursor;
}

public class TaskViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.titletext) TextView titletext;
@BindView(R.id.datetext) TextView datetext;
@BindView(R.id.timetext) TextView timetext;

public TaskViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}

@NonNull
@Override
public TaskViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.taskitem, parent, false);
return new TaskViewHolder(view);
@another_throwaway23: Rzeczywiście, pominąłem to.
Najpierw zrobiłem tak:

TaskDBHelper dbHelper = new TaskDBHelper(this);
mDatabase = dbHelper.getWritableDatabase();

efekt był taki sam. Więc wrzuciłem to: mTaskDBHelper = new TaskDBHelper(this);
I pojawił się to:

android.database.sqlite.SQLiteDatabase.query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String)' on a null object reference

Masz na myśli inicjację Adaptera w onCreate?
mMainAdapter = new MainAdapter(this, mTaskDBHelper.getAllItems());
@DanielAquarius: generalnie jakiekolwiek ORM nad gołą bazą jest bardziej pożądane. Sprawdź ten Realm, można też zerknąć na Room.

co do tych NPE, to musisz debuggerem się pobawić sam po prostu i znaleźć czego w porę nie inicjalizujesz.

Nie inicjację, tylko inicjalizację. Tak, przekazujesz tam Activity do adaptera co zapewne spowoduje Ci wyciek pamięci. Jeżeli jest Ci koniecznie potrzebny kontekst wewnątrz adaptera to niech to będzie kontekst całej aplikacji. Ale w 99%