2011-08-25 3 views
2

데이터베이스에서 여러 쿼리를 수행하기 위해 Android 객체에서 커서 객체를 다시 사용하는 것이 좋습니다. 쿼리간에 deactivate()를 호출해야합니까? 두 번째 쿼리 후 커서를 비활성화하지만 여전히 logcat에서 DatabaseObjectNotClosedException 경고를 받고 있습니다. 내 경험에커서를 다시 사용하는 Android

+1

커서가 쿼리를 작성하지 않고 쿼리 결과를 보유합니다. null로 설정하고 다시 사용할 수없는 이유가 표시되지 않습니다. – Jack

+0

내가 deactivate()를 호출하고 새로운 커서를 요청할 필요가 있다고 생각되는 문서를 다시 살펴 본다. 새 커서를 요청하기 전에 null로 설정하는 것이 필요하다고 생각하지 않습니다. – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

답변

0

, 당신은 새로운 무언가로 커서를 설정할 수 있습니다. deactivate()를 호출 해 보았습니다.하지만 내 앱이 엉망이되어서 사용하지 않기로 결정했습니다. 그것이 좋은 연습인지 아닌지는 잘 모르겠지만, 나에게 잘 돌아갔다. 그리고 나의 테스트가가는 한, 그것은 누출되거나 아무것도 느리게 보이지 않는다.

0

음, requery()는 사용되지 않습니다, 가시 어떤 이유로 deactivate()는 없습니다. 당신은 다른 하나 없이는 실제로 사용할 수 없으므로 deactivate()을 사용하면 안된다고 생각할 수 있습니다. 어쨌든 커서를 닫으면 곧바로 커서를 닫으면 성가신 DatabaseObjectNotClosedException이 제거됩니다. 새 로더 프레임 워크는 새 커서를 반환하도록 권장하고, 이전 커서는 바꿀 때 자동으로 닫힙니다.

+0

사실이 아닙니다. 재 쿼리를 사용하지 않고 비활성화를 사용할 수 있습니다. Requery는 호출 할 필요가 없기 때문에 더 이상 사용되지 않습니다. deactivate를 호출 한 다음 database.rawQuery() 또는 이와 유사한 함수를 호출하여 새 커서를 만들면됩니다. – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

+0

왜 전화를 끊으시겠습니까? –

1

requery()deactivate()은 현재 지원되지 않습니다 (API 11부터 첫 번째, API 16부터 후자). 나는 정답이 아직 없다고 믿기 때문에 나는 거의 7 년 동안의이 질문에 대답하고있다.

내 경험에 비추어 볼 때, Cursor 개체를 다시 사용하는 것은 좋지 않습니다.SQLiteOpenHelper 클래스의 내 구현은 여러 가지 방법을 가지고, 나는 모든 이들의 Cursor 개체를 닫습니다 - 나는 각 방법의 끝에서 Cursor 객체를 폐쇄하기 때문에 나는 그것을 믿고, 그것은 정확했다. 그러나 단순히 것 몇 가지 방법에 나는 내가 읽은 다음, 처음에는 쿼리를 실행 (여기에 여러 쿼리의 결과를 저장하기위한 하나 개의 Cursor 객체를 사용하여 재되었으며 Cursor에서 결과를 사용하고 나는 생각했다 다른 쿼리를 실행 이미 사용 된 Cursor의 이전 결과를 덮어 씀). StrictMode을 사용 설정하면 잘못되었습니다. DatabaseObjectNotClosedException 충돌이 발생하기 시작했습니다.

나는 더 이상 Cursor 개체를 다시 사용하지 않음으로써 그것을 해결했습니다. 지금은, 각 쿼리에 대한 새로운 Cursor 변수를 생성 한 후 읽고 결과를 저장하고는 나는 Cursorclose() 메서드를 호출하고 더 이상 사용하지 않습니다. 이 메서드에서 다른 쿼리를 실행해야 할 경우 의도적으로 이전 Cursor을 사용하지 않고 항상 새 변수를 만듭니다. StrictMode이 활성화되어 있어도 경고 또는 충돌이 더 이상 나타나지 않습니다. 가비지 컬렉터가 제대로 작동한다고 믿기 때문에 Cursor 클래스의 여러 인스턴스를 만드는 것이 큰 문제라고 생각하지 않습니다. 반대로 하나의 Cursor 개체 만 다시 사용하면 문제가있는 것 같습니다. 따라서 경고와 내 문제는 StrictMode으로 나타납니다.

저는 데이터베이스 전문가가 아니며 여전히 Android 프로그래밍의 모범 사례를 배우고 있습니다. 그러나이 주제에 대해 저는 정확하다고 생각합니다. Cursor 객체를 다시 사용하지 않거나 메모리를 확보 할 수 있습니다. 누출, 경고 및 심지어 충돌까지 포함 할 수 있습니다.

관련 문제