2013-12-03 35 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)作为列名。输入错误很容易。

希望这可以帮助您找到问题。