2013-12-03 37 views
1

我正在從SQLite數據庫讀取數據,表面上正確打開。但是,當我試圖比較我從中抽取的兩個對象的標題時,我得到一個空指針異常,這表明讀取過程如何寫入。當然 - 當我評論比較部分(這將按名稱按字母順序排列植物列表)時,應用程序將運行,但視圖中的所有數據字段顯示爲'null'。我已經多次查看代碼,並且假設我必須做一些邏輯上錯誤的事情,那就是另一組眼睛可能能夠檢測到。打開+讀取與SQLite數據庫,但獲得空值?

這裏是logcat的輸出與堆棧跟蹤:

[ 12-03 10:16:57.563 5898:0x1714 E/AndroidRuntime ] 
FATAL EXCEPTION: AsyncTask #1 
java.lang.RuntimeException: An error occured while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:200) 
    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
    at java.lang.Thread.run(Thread.java:1019) 
Caused by: java.lang.NullPointerException 
    at net.xxx.wildedibles.full.intro.LoadingFragment$LoadingTask$1.compare(LoadingFragment.java:101) 
    at net.xxx.wildedibles.full.intro.LoadingFragment$LoadingTask$1.compare(LoadingFragment.java:99) 
    at java.util.TimSort.countRunAndMakeAscending(TimSort.java:320) 
    at java.util.TimSort.sort(TimSort.java:199) 
    at java.util.TimSort.sort(TimSort.java:169) 
    at java.util.Arrays.sort(Arrays.java:2090) 
    at java.util.Collections.sort(Collections.java:1965) 
    at net.xxx.wildedibles.full.intro.LoadingFragment$LoadingTask.doInBackground(LoadingFragment.java:99) 
    at net.xxx.wildedibles.full.intro.LoadingFragment$LoadingTask.doInBackground(LoadingFragment.java:68) 
    at android.os.AsyncTask$2.call(AsyncTask.java:185) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
    ... 4 more 

這是LoadingFragment的相關部分:

Plant plant = new Plant(); 
      GlobalData.plantArray = plant.populatePlantDataFromDB(mDbHelper); 

      Collections.sort(GlobalData.plantArray , new Comparator<Plant>(){ 
       public int compare(Plant plant1, Plant plant2) { 
        return plant1.getTitle().compareToIgnoreCase(plant2.getTitle()); 
       } 
      }); 

這是植物類的相關部分:

//Population method to read from DB 
    public List<Plant> populatePlantDataFromDB(DBAdapter mDbHelper){ 

     List<Plant> plantsList = new ArrayList<Plant>(); 

     String selectQuery = "SELECT * FROM plants"; 

     Cursor c = mDbHelper.getData(selectQuery); 

     // looping through all rows and adding to list 

     c.moveToFirst(); 
       do { 
        Plant plant = new Plant(); 
        plant.setId(c.getInt((c.getColumnIndex("id")))); 
        plant.setTitle((c.getString(c.getColumnIndex("title")))); 
     plant.setScientificName((c.getString(c.getColumnIndex("scientificName")))); 
          //many, many fields 
plantsList.add(plant); 
      } while (c.moveToNext()); 


     c.close(); 
     return plantsList;  
    } 

對不起,如果代碼間距有點古怪,但你可以看到這裏發生了什麼。

非常感謝您能告訴我的任何事情!

+0

調試時,你的'GlobalData.plantArray'中有什麼? – Szymon

+0

看起來像數據庫中的列是空的。你檢查過了嗎? – njzk2

+0

如果植物表爲空,則代碼將失敗。 –

回答

0

比較法的正確實施應該可以解決你所得到的NullPointerException異常:

Collections.sort(GlobalData.plantArray , new Comparator<Plant>(){ 
      public int compare(Plant plant1, Plant plant2) { 
       if(plant1 == null || plant2 == null || TextUtils.isEmpty(plant1.getTitle()) || TextUtils.isEmpty(plant2.getTitle())){ 
         return 0 ; 
       } 
       return plant1.getTitle().compareToIgnoreCase(plant2.getTitle()); 
      } 
     }); 

,爲空值,確保列的名稱是否正確

+0

謝謝你的修正,但我試過這個,所有的字段仍然顯示'null'。我認爲問題不是比較方法,而是涉及實際讀取數據庫的問題。我只是不知道_where _... – nectaris

+0

@nectaris是否確定要查詢的列名?你是否得到多於一行的結果,但所有的值都是空的? –

0

我會測試:

if (c == null) return null; 

也,而不是

getColumnIndex() 

我會用:

getColumnIndexOrThrow() 

爲了測試,我也將重寫toString()在植物類,並寫有編號,標題和scientificName。然後將每個工廠對象記錄在獲取數據庫條目的while循環中,使用toString()並查看缺少的內容。

我也會使用常量(public static final)作爲列名。輸入錯誤很容易。

希望這可以幫助您找到問題。