2011-09-09 4 views
3

커서를 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) 

대부분의 데이터베이스 캐시 창은 모든 결과를 저장할 수있는 작지만 큰 데이터베이스에서이 당신을 공격하려고하기 때문에 이것은, 안드로이드의 버그처럼 보인다.

+0

이 페이지 (http://www.sqlite.org/malloc.html)에서 "SQLite는 동적 메모리 할당을 사용하여 쿼리 결과를 저장합니다."라는 내용의 페이지를 발견했습니다. 이것은 결과가 메모리에 캐시되어 있음을 나타냅니다. 비록 매우 큰 결과 세트가 있다면 분명히 한계가 있지만 캐시가 너무 커지면 임시 파일을 생성해야합니다. – satur9nine

답변

2

마지막으로 확인한 커서는 데이터베이스를 만든 SQL의 스냅 샷입니다. 데이터 세트와 매우 비슷합니다. 데이터베이스를 변경하면 커서는 스냅 샷이 오래되었음을 알지 못할 수 있습니다. 커서를 다시 작성한 쿼리를 수행하여 커서를 생성 한 원래 SQL을 기반으로 새로운 데이터를 얻을 수 있습니다.

+0

나는 당신이 정확하다고 생각하지만이 어딘가에 더 완벽한 문서가 있다면 궁금하다. – satur9nine

+0

SQLiteDatabase 문서에서 : 커서 개체, 첫 번째 항목 앞에 위치합니다. 커서는 동기화되지 않습니다. 자세한 내용은 문서를 참조하십시오. – Pyrodante

+0

여기에 관련된 문서에 대한 링크가 있습니까? 좀 더 자세한 정보를 원한다면 파일 시스템에 임시 파일이 기록되어 있습니까? 이처럼 많은 행을 포함하는 쿼리를 수행하는 것은 큰 벌점이 될 것입니다. – satur9nine

관련 문제