마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

RecyclerView와 Sqlite 사용중 발생된 에러인데 도움좀 부탁드려요.

0 추천

 

내용이 좀 길거 같아 문제 에러 코드 부터 적어 넣을게요.

에러 코드 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으로 종료가 될텐데 그러지도 않고 에러 내놓고 강제종료가 

됩니다 ㅠ 하...

뭐가 문제일까요?

nickeun (540 포인트) 님이 2018년 4월 10일 질문

1개의 답변

0 추천

adapter 구현 내용이 전체적으로 이해가 안되는 구조네요. 

정보가 부족해서 정확한 가이드는 드리기 힘들겠지만,

확실한 것 한가지는, mCursor.close();는 잘못된 코드네요.

첨부된 코드상 MessageAdapter instance가 유효할때까지는 Cursor.close()가 이루어지면 안됩니다.

localDB(comment);
mCursor = db.getAllChat();
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
messageAdapter = new MessageAdapter(getApplicationContext(), mCursor, uid);
recyclerView.setAdapter(messageAdapter);
// mCursor.close(); // error

 

디자이너정 (42,810 포인트) 님이 2018년 4월 10일 답변
소스코드 전문을 다시 올려볼까요? ㅠ

cursor부분 답변은 정말 감사합니다. ^^ 한가지 다시 배워갑니다.
다시 올렸습니다. 혹시 시간이 되시면 부탁 드리겠습니다.
...