내용이 좀 길거 같아 문제 에러 코드 부터 적어 넣을게요.
에러 코드 1) No adapter attached; skipping layout
에러 코드 2) attempt to re-open an already-closed object: SQLiteQuery: SELECT * FROM chatdb
에러 코드 3) 2번이 발생되지 않을때 나타 나더군요 Cursor on a null object reference
중요도 순으로는 2번이 큰 문제입니다 ㅠ
이제 소스코드를 올려볼게요
private ChatDBHelper db;
db = ChatDBHelper.getInstance(getApplicationContext());
SqliteHelper 안에는 싱글패톤 적용해서 리턴 받습니다.
public static ChatDBHelper getInstance (Context context){
initialize(context);
return adapter;
}
이렇게해서 db 쿼리문은 이렇게 접근합니다.
이제부터 제자 직접 사용할 부분입니다. 여기서부터 문제가 시작되네요
클릭이벤트 안에서 작동되는 소스 부분입니다.
localDB(comment);
mCursor = db.getAllChat();
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
messageAdapter = new MessageAdapter(getApplicationContext(), mCursor, uid);
recyclerView.setAdapter(messageAdapter);
mCursor.close();
localDB는 리스트 형태의 comment가 전달되어 db.쿼리문으로 SQLite에 저장됩니다.
다른부분 다 주석처리하고 저거만 실행여부 확인하면 DB에 저장이 잘 되고 있습니다.
RecyclerView 를 다른 파일로 만들어놨고요 messageAdapter 로 사용되고 있습니다.
messageAdapter 코드 부분은요..
public MessageAdapter(Context context, Cursor mCursor, String uid) {
this.context = context;
this.adapterCursor = mCursor;
this.uid = uid;
}
이렇게 전달되어 RecyclerView 내에 필요한 기본 데이터로 사용됩니다.
public int getItemCount() {
int count = adapterCursor.getCount();
return count;
}
그런데 2번 에러나고 문제 지점을 집어 주는데 제가 이해가 안되는 부분에 집어 주더라고요.
RecyclerView 소스 코드 안에 있는
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
MessageViewHolder messageViewHolder = ((MessageViewHolder)holder);
if (!adapterCursor.moveToPosition(position))
return;
moveToposition 부분에서 집어 줍니다.; ㅠ
에러코드 2번이 발생하지 않을때는 Cursor null 에러 부분도 있고해서 전달 받은 데이터가 없나
확인해보면 adapterCursor 안에는 분명 데이터들이 존재 하더라고요.
혹시 비었더라면 에러가 아니라 return으로 종료가 될텐데 그러지도 않고 에러 내놓고 강제종료가
됩니다 ㅠ 하...
뭐가 문제일까요?