【发布时间】:2013-03-18 07:41:04
【问题描述】:
我有很多客户遇到标题中提到的异常,但我无法在我的任何设备上重现它。
错误报告似乎表明该错误仅发生在 Sony 设备上,但我似乎找不到任何关于 Sony 在 Android 上使用他们的数据库做任何有趣事情的报告。
触发此异常的代码正在结束一个事务
db.beginTransaction();
for(some iterator)
db.execSQL("UPDATE table SET column = " + value + " WHERE other_column = " + something);
db.setTransactionSuccessful();
db.endTransaction();
这里的堆栈跟踪是:
android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 1290)
at android.database.sqlite.SQLiteConnection.nativeExecute(Native Method)
at android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:559)
at android.database.sqlite.SQLiteSession.endTransactionUnchecked(SQLiteSession.java:437)
at android.database.sqlite.SQLiteSession.endTransaction(SQLiteSession.java:401)
at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:530)
数据库驻留在外部存储上(但根据客户报告,它发生在外部存储安装时):
SQLiteDatabase db = SQLiteDatabase.openDatabase("/path/to/sqlite", null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
请不要对代码太苛刻,我知道(例如)应该有一个 try/catch 围绕在 endTransaction 的 sql 语句中,但在这种情况下没有任何区别(我目前没有资源来清理这个遗留问题)。
我在 AIX 上发现了一些关于 SQLITE_IOERR_DIR_FSYNC 的旧报告,其中不支持目录上的 fsync(),但这并没有真正帮助我,因为我显然无法在 Android 上使用正确的编译器标志重新编译 SQLite...
有什么想法吗?
【问题讨论】:
-
您是否尝试在客户报告该错误的同一台索尼设备上重现该错误?
-
不,很遗憾,我无法使用任何 Sony 设备,而且我无法在我可以测试的任何设备上重现它(Samsung Galaxy 1&2、Nexus S、Nexus 4、几个三星平板电脑和 7 英寸 Kindle Fire HD);事实上,这个错误对我来说并没有发生过一次......
-
好的,如果您将您的 APK 转发给我,我可以使用 SE 设备,我可以试试...?
-
非常感谢,我构建了一个带有额外详细日志记录的 apk,我该如何发送给您?所以没有私人消息,对吧?如果没有其他问题,您可以通过 gmail 的
与我联系。再次感谢! -
mystackoverflowPontomedon 是这样吗?