BUG fix 記一次翻車事故 SQLiteException: no such table: xxx(code 1): , while compiling: SELECT

 如上所示: 真是慘痛的BUG  我找了很久. 尋找過程如下:

1 由於機器是刷機開機之後,報了這個錯誤,報錯之後,再次進入原來報錯界面就不會報錯了. 所以不是很好測試.  同事建議我說,可以把數據庫導出來看看是否存在對應的數據庫(十分感謝同事!!)  在經過臨時ROOT機器之後,一層一層的通過命令行去改變文件權限並進入到對應的包名數據庫下面,pull出了數據庫,然後發現數據庫裏面的數據都是存在的,包名也存在. 那爲什麼BUG顯示不存在包名呢?

2 經過分析,也就是說在即使是報了異常,數據庫依然會創建成功,真是堅強啊!  這個時候沒轍了感覺. 於是去具體的分析存在的log信息, 剛開始我是過濾了log信息,只去顯示loge, 所以不能完全顯示所有的log信息. 所以在同事的催促下,我再次重現BUG,並抓取了所有的log信息, 發現了一條系統error ,我心想系統錯誤應該跟我沒關係,然後就過濾掉了,去查看其他信息,去查找報錯的源頭,查找未果,於是換了一個方向,去看了那條系統error的具體信息,發現了一個空指針異常的報錯,從此也發現了自己的一個盲區

3 我找到了對應的報錯位置, 是在數據庫的DataBaseHelper裏面,報錯空指針異常, 在此處我引用了一個context,這個context 是在我自定義的application的oncreate裏面初始化成功,然後通過設置靜態的方式提供出去的

    private static Context mContext;
   @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();

        mContext = this.getApplicationContext();
   public static Context getContext() {
        return mContext;
    }

然後,我覺得application初始化那麼早,怎麼可能會出現空指針呢?  於是我萬能才同事提出了一個設想就是, contentProvider的context 要比 application 的oncreate先初始化,所以導致空指針. 後來經過寫demo測試發現,確實存在這個問題.

就先在Application,Activity和ContentProvider三個類的onCreate函數中打印了log,發現它們的啓動順序爲:

Application->attachBaseContext =====>ContentProvider->onCreate =====>Application->onCreate =====>Activity->onCreate
--------------------- 
原文鏈接:https://blog.csdn.net/beyond702/article/details/49666809

原來他們的啓動順序不一致導致我盲目的去寫代碼, 基礎知識還是太欠缺了,基礎不牢地動山搖啊!!!! ,而且發現ContentProvider裏面的context和Application的onCreate裏面獲取到的context是同一個context

後來也是向同事表達了謝意,然後提交了代碼!  花了一下午的時間解決了這個問題,發現了自己的知識盲點,也是蠻開心的,希望以後還是多打好基礎

我原來以爲application裏面初始化的context可以在任何地方去調用的,想不到這次翻了車,阿西吧!

在查找的過程中涉及到的知識包括:

linux和adb命令行: 改變文件和文件夾的權限,如何臨時root

數據庫:android數據庫在機器中的具體位置,如何進入數據庫界面,如何導出數據庫,如何打開數據庫(涉及到的工具)

android基礎知識點:Application和ContentProvider的啓動順序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章