728x90
Fatal Exception: android.database.CursorWindowAllocationException: Could not allocate CursorWindow '/data/user/0/~. db' of size 4194304 due to error -12.
직접 재현되는 것은 아니지만 갑자기 특정 사용자의 Crashlytics로부터 위와 같은 내용의 에러 리포트를 받았습니다.
내용을 보니 Cursor 활용 부분에서 메모리 초과로 인한 Crash가 발생한 것으로 파악됩니다.
문제가 발생 코드는 특정 조건에 해당하는 데이터의 COUNT를 쿼리하는 내용이었습니다.
데이터나 메모리 사용량 등.. 근본적인 원인들이 있겠으나 일단 대응 코드로 어차피 1개 이상의 존재 유무만 파악하면 되는 것이므로 cursor.count의 호출을 제거하고 첫 번째 데이터 유무만 파악하도록 수정했습니다.
//기존 코드
if (cursor != null) {
if (cursor.count > 0) {
cursor.moveToFirst()
result = cursor.getInt(0)
}
cursor.close()
}
//신규 코드
cursor?.use {
if (it.moveToFirst()) {
result = cursor.getInt(0)
}
}
또 다른 대응 방법으로는 현재 문제의 쿼리 함수에서 rawQuery를 사용 중이라면, 일반 query 함수를 사용하는 것이 도움이 될 수도 있습니다. 이는 자동으로 CursorWindow를 효율적으로 사용하도록 도와줄 수 있습니다.
728x90