如何防止Android SQLite从转储堆栈跟踪到logcat



在Android 2.3.3我正在做一个批量导入到我的SQLite表,使用API方法:

SQLiteDatabase。insert(String table, String nullColumnHack, ContentValues values)

它工作得很好,但如果有一个数据库错误与任何行(例如约束错误)一个完整的堆栈跟踪写入Android Logcat,它很快填满。

如何关闭堆栈跟踪?

我已经处理了抛出的任何异常,但Logcat正在被SQLite库代码污染。

我很担心移动设备的性能。

  • 已启用导入事务
  • 预加载DB是不可能的,因为数据可能会改变

约束应该被强制执行,我将处理违规,但是对于每个违规,Logcat中的20行堆栈跟踪乘以数百个违规是我想要关闭的。

不幸的是,我也不能使用Android Froyo引入的高级冲突处理,因为应用程序也必须在旧设备上运行。

欢呼。

好的,我刚刚找到解决方案如下:

我必须使用不同的API方法(不是SQLiteDatabase.insert()):

SQLiteDatabase.insertOrThrow(String table, String nullColumnHack, ContentValues values)

现在,异常从SQLite库抛出,正如预期的那样,没有堆栈跟踪被转储。

根据标记或进程ID过滤掉您不感兴趣的内容。您可以在Eclipse中的Logcat查看器中轻松地完成此操作,或者如果您在命令行中使用Logcat,则说明在这里。

这不是污染。LogCat的目的是注册设备/模拟器上发生的一切。

如果您想要过滤掉您的LogCat,在Eclipse中是可能的(您可以通过日志标记、pid或日志级别进行过滤),从而提供了一种从LogCat窗口"删除"不需要的异常的方法。

编辑如果问题是性能(根据你的评论),我认为你不应该担心。

  • 如果你发现性能不好,你可以通过在批处理插入上启用事务来获得更多。
  • 另外,如果要为应用程序插入"启动数据",您是否考虑过将apk与预加载的数据库一起发货?不必在运行时插入所有内容,只需复制自己准备的现有数据库即可。不再有约束问题,用户几乎可以立即启动。当然,如果是动态批插入(基于用户输入或运行时定义的外部参数),则不可能。

最新更新