0

当新的 sqlites 添加到 SD 卡上的特定目录时,我在使用 FileObserver 更新元数据库时遇到了问题。如果我手动 adb 将一个新的 sqlite 推送到目录,然后调用onEvent(FileObserver.CREATE, <filename>),它可以完美运行。但是,当我调用FileObserver.startWatching()并 adb 推送一个新的 sqlite 以供观察者自己捕获时,它会调用onEvent(使用与我手动调用它时相同的参数 - 我检查过),打开 sqlite 文件正常,但找不到任何当我查询新打开的 sqlite 并引发 sqlite 异常时,它的表。

我正在使用 SQLiteDatabase 的openDatabase()方法,所以它不会找不到原始文件并创建一个空的(一个常见问题)。此外,在 adb shell 中进行的相同 sqlite 查询可以很好地访问新添加的 sqlite 表。

有人知道为什么会发生这种情况吗?根据手动调用的成功,我的代码似乎可以正常工作,因此我正在寻找我可能错过的 Android 上的 FileObservers 或 SQLite 的任何怪癖,因为我对这两者都是新手。

onEvent(FileObserver.CREATE, <filename>)_ onEvent_方法。

4

1 回答 1

0

我发现了问题-Android的FileObserveronEvent方法,对于文件创建事件,在文件创建后立即执行,而不是等待文件完成写入。我遇到了一个竞争条件,该onEvent方法试图在文件实际完成写入之前查询数据库。当我 adb push 然后onEvent手动调用时,有足够的时间来写入文件,这就是它当时起作用的原因。

快速修复是让我在 onEvent 中调用参数FileObserver.CLOSE_WRITE而不是CREATE. 由于我正在使用对这些数据库的只读访问权限,因此它们将被写入的唯一时间是第一次,并且在CLOSE_WRITE它们完成并准备好被查询之前不会触发事件。

于 2013-07-12T18:03:34.033 回答