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

SQLite 사용중 Cursor 불러올 때 메모리 에러...

0 추천

디비에서 데이터를 불러오는데 이런식으로 불러옵니다.

 

while(c.moveToNext(){

  A a = new A();

  a.int_val = c.getInt(id_intval);

  a.str_val = c.getString(id_strval);

  a.my_val = getMyDb(c.getInt(id_myval));

  .

  .

  .

  aList.add(a);

}

c.close();

 

위와같이 불러옵니다. int나 string 형태의 기본형 데이터도 가져오지만 key 값으로

다른 테이블을 조회해(그 안에서 또 Cursor가 열리고 닫히 겠죠) 데이터를 담는 getMyDb()같은 부분도 있습니다.

헌데 이게 일정 텀을 두고 호출 될땐 아무 문제가 없는데 짧은 시간에 꽤 많은 횟수가 호출 되면

아래와 같은 로그를 찍으면서 쿼리에 실패합니다.

Could not allocate CursorWindow 'my_database.sqlite' of size 2097152 due to error -12.
 
 
확인 해보니 getMyDb() 함수 부분에서 호출 되는데 반복문 안에서, 그러니까 Cursor가 열려있는 상태에서 또다른 커서를 수업이 여는 것이 문제가 되는 걸까요? 다 확인 해봐도 Cursor는 사용후 항상 close() 함수를 호출 해주도록 되어 있습니다.
장승제 (760 포인트) 님이 2014년 5월 9일 질문

2개의 답변

+1 추천
저거는 커서로는 2MB 이상의 데이터는 불러올수 없다는 에러입니다만...
건방진프로그래머 (26,630 포인트) 님이 2014년 5월 9일 답변
원래 1메가여다가 허니콤이후인가 아샌인가부터 2메가로 변경되어다고 들었음요... 이미지라도 불러오시나요 ㅡㅡ?
네 그건 알고 있는데 이게 한번만 호출하면 저 에러가 안 나는데
여러번 연속적으로 호출할때 저 에러가 나서...

근데 반복문과 Cursor 작업을 중첩으로 하는 구조에서 어떤 부분이 문제가 될까 싶어 질문한 겁니다... ㅠ
아니요! 모두 텍스트에요!
채팅이구요!
getMyDb 하실때 이넘 커서 안닫으신거 아닌가요?
0 추천
오랜 질문이지만.. 혹시 해결하셨나요..?

저도 동일하게 while 문에서 cursor 오류가 발생하고 있어서.. 궁금하네요..
흉기 님이 2022년 8월 31일 답변
...