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

时间:2011-11-30 10:39:22

标签: android sqlite stack-trace logcat

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

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

它运行正常,但如果任何行存在数据库错误(例如约束错误),则会将完整的堆栈跟踪写入Android Logcat,这会快速填满。

如何关闭此堆栈跟踪?

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

我担心移动设备的性能。

  • 已启用导入的交易
  • 预加载的数据库是不可能的,因为数据可能会改变

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

不幸的是,我也无法使用Android Froyo引入的高级冲突处理,因为app也必须在较旧的设备上运行。

干杯。

3 个答案:

答案 0 :(得分:6)

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

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

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

现在,正如预期的那样从SQLite库抛出异常,并且不会转储堆栈跟踪。

答案 1 :(得分:0)

根据代码或进程ID,过滤掉您不感兴趣的任何内容。您可以在Eclipse中的Logcat查看器中轻松完成,或者如果您在命令行the instructions are here上使用Logcat。

答案 2 :(得分:0)

这不是污染。 LogCat的目的是注册设备/模拟器上发生的所有事情。

如果要过滤掉LogCat,可以在Eclipse中进行过滤(可以按日志标记,按pid或按日志级别进行过滤),从而提供一种从LogCat窗口中“删除”不需要的异常的方法。

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

  • 如果您发现糟糕的表现,您可以通过在批量插页上启用交易来获得更多。
  • 另外,如果要为您的应用程序插入“起始数据”,您是否考虑过使用预先加载的数据库发送apk?您可以只复制自己准备的现有数据库,而不是在运行时插入所有内容。没有约束问题,几乎可以立即启动您的用户。当然,如果是动态批量插入(基于用户输入或运行时定义的外部参数),则无法实现。