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 событие не будет инициировано, пока они не будут готовы и не будут запрошены.

Другие вопросы по тегам