데이터베이스에서 여러 쿼리를 수행하기 위해 Android 객체에서 커서 객체를 다시 사용하는 것이 좋습니다. 쿼리간에 deactivate()를 호출해야합니까? 두 번째 쿼리 후 커서를 비활성화하지만 여전히 logcat에서 DatabaseObjectNotClosedException 경고를 받고 있습니다. 내 경험에커서를 다시 사용하는 Android
답변
, 당신은 새로운 무언가로 커서를 설정할 수 있습니다. deactivate()를 호출 해 보았습니다.하지만 내 앱이 엉망이되어서 사용하지 않기로 결정했습니다. 그것이 좋은 연습인지 아닌지는 잘 모르겠지만, 나에게 잘 돌아갔다. 그리고 나의 테스트가가는 한, 그것은 누출되거나 아무것도 느리게 보이지 않는다.
음, requery()
는 사용되지 않습니다, 가시 어떤 이유로 deactivate()
는 없습니다. 당신은 다른 하나 없이는 실제로 사용할 수 없으므로 deactivate()
을 사용하면 안된다고 생각할 수 있습니다. 어쨌든 커서를 닫으면 곧바로 커서를 닫으면 성가신 DatabaseObjectNotClosedException
이 제거됩니다. 새 로더 프레임 워크는 새 커서를 반환하도록 권장하고, 이전 커서는 바꿀 때 자동으로 닫힙니다.
사실이 아닙니다. 재 쿼리를 사용하지 않고 비활성화를 사용할 수 있습니다. Requery는 호출 할 필요가 없기 때문에 더 이상 사용되지 않습니다. deactivate를 호출 한 다음 database.rawQuery() 또는 이와 유사한 함수를 호출하여 새 커서를 만들면됩니다. – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
왜 전화를 끊으시겠습니까? –
requery()
과 deactivate()
은 현재 지원되지 않습니다 (API 11부터 첫 번째, API 16부터 후자). 나는 정답이 아직 없다고 믿기 때문에 나는 거의 7 년 동안의이 질문에 대답하고있다.
내 경험에 비추어 볼 때, Cursor
개체를 다시 사용하는 것은 좋지 않습니다.SQLiteOpenHelper
클래스의 내 구현은 여러 가지 방법을 가지고, 나는 모든 이들의 Cursor
개체를 닫습니다 - 나는 각 방법의 끝에서 Cursor
객체를 폐쇄하기 때문에 나는 그것을 믿고, 그것은 정확했다. 그러나 단순히 것 몇 가지 방법에 나는 내가 읽은 다음, 처음에는 쿼리를 실행 (여기에 여러 쿼리의 결과를 저장하기위한 하나 개의 Cursor
객체를 사용하여 재되었으며 Cursor
에서 결과를 사용하고 나는 생각했다 다른 쿼리를 실행 이미 사용 된 Cursor
의 이전 결과를 덮어 씀). StrictMode
을 사용 설정하면 잘못되었습니다. DatabaseObjectNotClosedException
충돌이 발생하기 시작했습니다.
Cursor
개체를 다시 사용하지 않음으로써 그것을 해결했습니다. 지금은, 각 쿼리에 대한 새로운
Cursor
변수를 생성 한 후 읽고 결과를 저장하고는 나는
Cursor
에
close()
메서드를 호출하고 더 이상 사용하지 않습니다. 이 메서드에서 다른 쿼리를 실행해야 할 경우 의도적으로 이전
Cursor
을 사용하지 않고 항상 새 변수를 만듭니다.
StrictMode
이 활성화되어 있어도 경고 또는 충돌이 더 이상 나타나지 않습니다. 가비지 컬렉터가 제대로 작동한다고 믿기 때문에
Cursor
클래스의 여러 인스턴스를 만드는 것이 큰 문제라고 생각하지 않습니다. 반대로 하나의
Cursor
개체 만 다시 사용하면 문제가있는 것 같습니다. 따라서 경고와 내 문제는
StrictMode
으로 나타납니다.
저는 데이터베이스 전문가가 아니며 여전히 Android 프로그래밍의 모범 사례를 배우고 있습니다. 그러나이 주제에 대해 저는 정확하다고 생각합니다. Cursor
객체를 다시 사용하지 않거나 메모리를 확보 할 수 있습니다. 누출, 경고 및 심지어 충돌까지 포함 할 수 있습니다.
- 1. Android 아키텍처 : 어디에서 커서를 보유해야합니까?
- 2. android editText가 커서를 볼 수 있습니까?
- 3. 웹 사이트에서 대기 커서를 사용하는 것이 좋습니까?
- 4. 커서를 사용하는 중 문제가 안드로이드 SQLite3 데이터베이스에서
- 5. 다시 그리기 android spinner
- 6. Android 서비스 다시 시작
- 7. Android 액티비티가 다시 시작됩니다.
- 8. Android : 다중 언어 리소스에서 문자열을 다시 사용하는 방법
- 9. Android에서 커서를 어떻게 처리합니까?
- 10. Android : 원격 서비스를 다시 시작하고 다시 바인딩하기
- 11. Android 알림이 앱을 다시 시작하지만 다시 시작하려고합니다.
- 12. Android : CursorAdapter를 사용하는 방법?
- 13. jQuery Javascript ratings : 사용자가 커서를 끌 때 등급이 다시 나타나게합니다.
- 14. 웹 응용 프로그램 : DB 커서를 유지하거나 다시 만드시겠습니까?
- 15. 어떻게 C# .NET TextReader 커서를 시작점으로 다시 설정합니까?
- 16. Qt - 커서를 모래 시계로 바꾸고 커서를 비활성화하십시오.
- 17. 마우스 커서를 화살표로 변경
- 18. 양식 필드에 커서를 놓습니다.
- 19. WinForms 커서를 '지속적으로 숨기기'하시겠습니까?
- 20. Android : 타이머를 다시 시작하지 못함
- 21. Android 웹 앱이 다시 시작됩니다.
- 22. 방향으로 다시 시작한 Android 동영상
- 23. Android 다시 시작 내 활동
- 24. 30fps의 Android 캔버스 다시 그리기
- 25. 커서를 사라지게 만들기
- 26. trie를 사용하는 android dictionary
- 27. android listview를 사용하는 검색어
- 28. XML을 사용하는 Android OutOfMemoryError
- 29. Android : SectionIndexer를 사용하는 방법
- 30. ACRA를 사용하는 Android 크래시보고
커서가 쿼리를 작성하지 않고 쿼리 결과를 보유합니다. null로 설정하고 다시 사용할 수없는 이유가 표시되지 않습니다. – Jack
내가 deactivate()를 호출하고 새로운 커서를 요청할 필요가 있다고 생각되는 문서를 다시 살펴 본다. 새 커서를 요청하기 전에 null로 설정하는 것이 필요하다고 생각하지 않습니다. – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz