2013-07-11 1 views
0

SD 카드의 특정 디렉토리에 새로운 sqlite가 추가되면 FileObserver를 사용하여 메타 데이터베이스를 업데이트하는 데 문제가 있습니다. 만약 내가 수동으로 디렉토리에 새로운 sqlite를 밀어 adb, 그럼 onEvent(FileObserver.CREATE, <filename>) 전화, 완벽하게 작동합니다. 그러나 FileObserver.startWatching()을 호출하고 adb가 관찰자가 잡을 새 sqlite를 호출하면 onEvent (수동으로 호출 할 때와 동일한 매개 변수로 - 확인)을 호출하고 sqlite 파일을 열었지만 찾을 수 없습니다. 해당 테이블 중 내가 새로 열린 sqlite를 쿼리하고 sqlite 예외를 throw합니다.안드로이드 FileObserver는 SQLite를 찾았지만 테이블/내용은 찾지 못했습니다.

나는 SQLiteDatabase의 openDatabase() 메서드를 사용하므로 원본을 찾고 빈 빈 (일반적인 문제)을 만드는 데 실패하지 않습니다. 또한, adb 셸에서 만들어진 동일한 sqlite 쿼리는 새로 추가 된 sqlite의 테이블에 잘 액세스합니다.

왜 이런 일이 일어날 지 아무도 모르는 사람이 있습니까? 내 코드는 수동 호출의 성공을 바탕으로 잘 작동하는 것 같습니다. 필자가 놓친 것 같은 FileObservers 또는 SQLite를 가진 모든 단점을 찾고 있습니다.

UPDATE : 또한 디버깅 내가 파일을 눌러 수동으로 onEvent(FileObserver.CREATE, <filename>) 전화 ADB 있다면,보고 FileObserver를 시작하고 ADB는 같은 위치에 같은 파일을 밀어 것을 보여준다는 FileObserver는 테이블의 위치를 ​​문제없이 그 onEvent 쿼리를 실행합니다. .. 이것이 무엇을 의미하는지 확실하지 않습니다.

답변

0

문제를 찾았습니다. 안드로이드의 FileObserver의 onEvent 메서드는 파일 생성 이벤트에 대해 파일 작성이 끝나기를 기다리지 않고 즉시 실행됩니다. 파일이 실제로 쓰여지기 전에 onEvent 메쏘드가 데이터베이스를 질의하려고하는 경합 조건에 부딪혔습니다. 내가 밀어 넣은 다음 onEvent을 수동으로 호출하면 파일을 쓸 수있는 충분한 시간이 생겨서 그때부터 효과가있었습니다.

CREATE 대신 FileObserver.CLOSE_WRITE 매개 변수에 대해 onEvent에서 쿼리를 호출하는 빠른 수정이 필요했습니다. 필자는 이러한 데이터베이스에 대한 읽기 전용 액세스로 작업하므로 처음 작성되는 시간은 처음이며 CLOSE_WRITE 이벤트는 완료되고 쿼리 할 준비가 될 때까지 트리거되지 않습니다.