커서를 Android의 sqlite DB 쿼리에서 다시 가져 오는 경우 DB에 어떤 일이 발생하든 관계없이 변경되지 않는 고정 된 수의 행이 포함 된 것으로 보입니다. 예를 들어 커서가 열려있는 동안 일부 행이 삭제 된 경우 삭제 된 행을 계속 참조 할 수 있습니다. 이것은 좋은 일이지만 어떻게 작동합니까?커서가 삭제 된 행을 어떻게 참조합니까?
sqlite는 내가 그 행을 가리키는 Cursor를 가지고 있으므로 이전 데이터의 복사본을 유지할 수 있습니다. 하지만 내가 백만 개의 행을 가지고 삭제하고 백만 개의 다른 행으로 대체한다면, 많은 양의 데이터를 캐시 할 수있을 것입니다!
UPDATE :
지금 우리가 안드로이드에서 볼이 캐싱 정말 방탄하지 않고 SQLite는의 일부가 아니라고 생각하고있다. 나는 그 안에 1,000,000 개의 행을 가진 데이터베이스를 만든 테스트를 만들었고, 결과를 인쇄 한 db를 열어 커서를 열어 놓은 다음, 행의 반을 지우고 마지막으로 커서를 열어서 결과에 접근하려고 시도했다. 충돌은 다음과 같습니다
04-05 18:17:16.141 E/AndroidRuntime(19655): java.lang.IllegalStateException: Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
04-05 18:17:16.141 E/AndroidRuntime(19655): at android.database.CursorWindow.nativeGetLong(Native Method)
04-05 18:17:16.141 E/AndroidRuntime(19655): at android.database.CursorWindow.getLong(CursorWindow.java:507)
04-05 18:17:16.141 E/AndroidRuntime(19655): at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:75)
04-05 18:17:16.141 E/AndroidRuntime(19655): at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:220)
04-05 18:17:16.141 E/AndroidRuntime(19655): at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:237)
04-05 18:17:16.141 E/AndroidRuntime(19655): at com.jacob.DirectDbActivity$4.run(DirectDbActivity.java:88)
대부분의 데이터베이스 캐시 창은 모든 결과를 저장할 수있는 작지만 큰 데이터베이스에서이 당신을 공격하려고하기 때문에 이것은, 안드로이드의 버그처럼 보인다.
이 페이지 (http://www.sqlite.org/malloc.html)에서 "SQLite는 동적 메모리 할당을 사용하여 쿼리 결과를 저장합니다."라는 내용의 페이지를 발견했습니다. 이것은 결과가 메모리에 캐시되어 있음을 나타냅니다. 비록 매우 큰 결과 세트가 있다면 분명히 한계가 있지만 캐시가 너무 커지면 임시 파일을 생성해야합니다. – satur9nine