2011-11-30 80 views
2

在Android 2.3.3我做了批量導入到我的SQLite表之一,使用API​​方法:如何防止Android SQLite將堆棧跟蹤轉儲到logcat?

SQLiteDatabase.insert(字符串表,字符串nullColumnHack,ContentValues值)

它工作正常,但是如果任何行出現數據庫錯誤(例如約束錯誤),則將完整堆棧跟蹤寫入Android Logcat,並快速填滿。

如何關閉此堆棧跟蹤?

我已經處理了拋出的任何異常,但Logcat被SQLite庫代碼中的污染。

我很擔心移動設備的性能。

  • 交易進口已經啓用
  • 預裝DB是不可能的,因爲數據可能會改變

約束應該強制執行,我會處理的違規行爲,但在logcat的20個堆棧跟蹤每個違反乘以數百次違規是我想要關閉的。

不幸的是,我也不能使用Android Froyo引入的高級衝突處理,因爲應用程序也必須在舊設備上運行。

乾杯。

+0

更好的是修復錯誤本身也許 – Caner

+0

同時我找到了解決方案,請參閱下面的答案。 – kasimir

回答

6

OK,我只是找到了解決辦法如下:

我必須使用不同的API方法(不SQLiteDatabase.insert()):現在

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

,異常是從SQLite庫拋出如預期的那樣,沒有堆棧跟蹤被傾倒。

0

只需根據標記或進程ID篩選出您不感興趣的任何內容即可。您可以在Eclipse的Logcat查看器中輕鬆完成,或者如果您在命令行the instructions are here上使用Logcat。

+0

謝謝,但正如我上面所說,我擔心實際移動設備上的性能,而不是在Eclipse中。 – kasimir

0

這不是污染。 LogCat的目的是在設備/仿真器上註冊所有正在進行的操作。

如果您想過濾掉LogCat,可以在Eclipse中進行過濾(可以通過日誌標記,pid或日誌級別進行過濾),從而提供了從LogCat窗口「刪除」不需要的異常的方法。

編輯如果問題是表現(根據您的意見),我認爲你不應該擔心。

  • 如果您發現性能不佳,您可以通過在批量插入中啓用交易來獲得更多的收益。
  • 此外,如果要爲您的應用程序插入「開始數據」,您是否考慮過將該apk安裝到預加載的數據庫中?與其在運行時插入所有內容,您可以複製您自己準備好的現有數據庫。不再有約束問題,並且幾乎可以爲您的用戶立即啓動。當然,如果它是動態批量插入(基於用戶輸入或運行時定義的外部參數),這是不可能的。
+0

但我擔心實際手機的表現。將完整的堆棧跟蹤轉儲到Logcat肯定需要花費時間和資源。 我在談論批量導入,數百行可能違反了我想忽略的約束。 現在它的行爲方式,在這種情況下,將數百個堆棧跟蹤寫入Logcat,每個堆棧跟蹤由20行左右組成。 – kasimir

+0

只是一個想法:如果你想忽略這個約束,你爲什麼要把它放在第一位呢?當然,如果它在那裏,它意味着被強制執行,不是嗎?但無論如何,我不認爲你應該擔心實際設備的性能影響,除非你打算從1995年開始使用手機;) – Guillaume

+0

請同時查看編輯後的性能提示答案。 – Guillaume