Android FileObserver находит SQLites, но не их таблицы / контент
Я сталкиваюсь с проблемой использования FileObserver для обновления метабазы данных, когда новые sqlites добавляются в определенный каталог на SD-карте. Если я вручную ADB подтолкнуть новый sqlite в каталог, а затем позвонить onEvent(FileObserver.CREATE, <filename>)
работает отлично. Тем не менее, когда я звоню FileObserver.startWatching()
и ADB толкать новый sqlite для наблюдателя, чтобы поймать сам, он вызывает onEvent
(с теми же параметрами, что и при вызове его вручную - я проверил), прекрасно открывает файл sqlite, но не может найти ни одну из его таблиц при запросе вновь открытого sqlite и выдает исключение sqlite.
Я использую базу данных SQLiteDatabase openDatabase()
метод, так что не удается найти оригинал и создать пустой (распространенная проблема). Кроме того, тот же запрос sqlite, выполненный в оболочке adb, очень хорошо обращается к недавно добавленным таблицам sqlite.
У кого-нибудь есть идеи, почему это может произойти? Мой код, кажется, работает нормально, основываясь на успехе ручного вызова, поэтому я ищу любые причуды с FileObservers или SQLite на Android, которые я мог бы пропустить, так как я новичок в обоих.
ОБНОВЛЕНИЕ: Дальнейшая отладка показывает, что если я ADB нажмите файл и вызову onEvent(FileObserver.CREATE, <filename>)
вручную, затем запустите FileObserver, наблюдающий и adb отправит тот же файл в то же место, FileObserver выполняет те onEvent
запросы без проблем с поиском таблиц... не уверен, что это значит.
1 ответ
Я выяснил проблему - Android FileObserver's onEvent
Метод для события создания файла выполняется сразу после создания файла, не дожидаясь окончания записи файла. Я был в состоянии гонки, где onEvent
Метод пытался выполнить запрос к базе данных до того, как файл был фактически завершен. Когда я ADB толкнул, а затем позвонил onEvent
вручную было достаточно времени для записи файла, поэтому он работал тогда.
Быстрое решение было для меня, чтобы вызвать запросы в onEvent для параметра FileObserver.CLOSE_WRITE
вместо CREATE
, Поскольку я работаю с доступом только для чтения к этим базам данных, единственный раз, когда они будут написаны, это первый раз, и CLOSE_WRITE
событие не будет инициировано, пока они не будут готовы и не будут запрошены.