2013-07-11 1 views
0

У меня возникла проблема с использованием FileObserver для обновления метабазы, когда новые sqlites добавляются в конкретный каталог на SD-карте. Если я вручную adb нажимаю новый sqlite в каталог, то звоните onEvent(FileObserver.CREATE, <filename>), он отлично работает. Тем не менее, когда я звоню FileObserver.startWatching() и adb нажимает новый sqlite для наблюдателя, чтобы поймать сам по себе, он вызывает onEvent (с теми же параметрами, что и при вызове вручную - я проверил), открывает файл sqlite отлично, но не удается найти любой из его таблиц, когда я запрашиваю недавно открытый sqlite и генерирует исключение sqlite.Android FileObserver находит SQLites, но не их таблицы/содержимое

Я использую метод SQLiteDatabase openDatabase(), поэтому он не может найти оригинал и создать пустую (общая проблема). Кроме того, тот же sqlite-запрос, сделанный в оболочке adb, позволяет получить доступ к недавно добавленным таблицам sqlite.

Есть ли у кого-нибудь идеи, почему это может произойти? Мой код, похоже, отлично работает на основе успеха ручного вызова, поэтому я ищу любые причуды с FileObservers или SQLite на Android, которые, возможно, пропустили, поскольку я новичок в обоих.

UPDATE: Далее отладка показывает, что если я ADB нажать файл и вызвать onEvent(FileObserver.CREATE, <filename>) вручную, а затем запустить FileObserver смотреть и ADB нажать один и тот же файл в том же место, FileObserver выполняет те onEvent запросов без проблем установочной таблицы. .. не уверен, что это значит.

ответ

0

Я понял, что проблема - метод FileObserver от Android onEvent для события создания файла выполняется сразу после создания файла, не дожидаясь завершения записи файла. Я столкнулся с условием гонки, когда метод onEvent пытался запросить базу данных до того, как файл фактически закончил писать. Когда я вставлял adb и затем вызывал onEvent вручную, было достаточно времени для записи файла, поэтому он и работал.

Быстрое решение заключалось в том, чтобы я вызывал запросы в onEvent для параметра FileObserver.CLOSE_WRITE вместо CREATE. Поскольку я работаю только с доступом только для чтения к этим базам данных, единственный раз, когда они будут записаны, это первый раз, и событие CLOSE_WRITE не будет запущено, пока они не будут выполнены и не будут готовы к опросу.

 Смежные вопросы

  • Нет связанных вопросов^_^