2014-05-15 64 views
0

SQLite的查詢我在做什麼 ::使用的AsyncTask線程來執行android系統

  • 我試圖運行在的AsyncTask一個SQLite查詢(因爲它執行 在一個單獨的線程中的交易)。
  • 我收到日誌錯誤,如圖
  • 當我調試,我發現在 getDataFromSqlite();代碼生成錯誤

問題 ::

  • 在哪裏,我錯了
  • 我該如何糾正自己

代碼段 ::

@Override 
    public void onStart() { 
     // TODO Auto-generated method stub 
     super.onStart(); 

     txtBufTime.setText(sendBufTime); 
     txtBufDistance.setText(sendDistance); 
     txtOnlinePrice.setText(sendOnlinePrice); 
     txtReservePrice.setText(sendReservePrice); 
     txtBuffetDesc.setText(sendDescription); 
     txtBufType.setText(sendBufType); 
     setRating(sendRating); 
     new LongOperation().execute(); 
    } 


    private class LongOperation extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... params) { 
      getDataFromSqlite(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      Toast.makeText(getActivity(), "DOne", Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     protected void onPreExecute() {} 

     @Override 
     protected void onProgressUpdate(Void... values) {} 
    } 



     public void getDataFromSqlite() { 
      /// 
      Cursor cursor = null; 
      DatabaseHandler mHelper = new DatabaseHandler(getActivity().getApplicationContext()); 
      SQLiteDatabase db = mHelper.getWritableDatabase(); 
      String queryString="select menu_type_id , cuisine_type_name , item_name" + 
           " from buffets " + 
           "where buff_off_id = " + sendBuffetId; 
      Log.d("queryString", queryString.toString()); 


      try { 
       cursor = db.rawQuery(queryString, null); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       cursor.close(); 
      } 

     } 

登錄 ::

**05-15 13:41:17.547: E/AndroidRuntime(2743): FATAL EXCEPTION: AsyncTask #5 
05-15 13:41:17.547: E/AndroidRuntime(2743): java.lang.RuntimeException: An error occured while executing doInBackground() 
05-15 13:41:17.547: E/AndroidRuntime(2743):  at android.os.AsyncTask$3.done(AsyncTask.java:278) 
05-15 13:41:17.547: E/AndroidRuntime(2743):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
05-15 13:41:17.547: E/AndroidRuntime(2743):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
05-15 13:41:17.547: E/AndroidRuntime(2743):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
05-15 13:41:17.547: E/AndroidRuntime(2743):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
05-15 13:41:17.547: E/AndroidRuntime(2743):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
05-15 13:41:17.547: E/AndroidRuntime(2743):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
05-15 13:41:17.547: E/AndroidRuntime(2743):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
05-15 13:41:17.547: E/AndroidRuntime(2743):  at java.lang.Thread.run(Thread.java:856) 
05-15 13:41:17.547: E/AndroidRuntime(2743): Caused by: java.lang.NullPointerException 
05-15 13:41:17.547: E/AndroidRuntime(2743):  at com.findmybuffet.fragments.FragBuffetContents.getDataFromSqlite(FragBuffetContents.java:154) 
05-15 13:41:17.547: E/AndroidRuntime(2743):  at com.findmybuffet.fragments.FragBuffetContents$LongOperation.doInBackground(FragBuffetContents.java:120) 
05-15 13:41:17.547: E/AndroidRuntime(2743):  at com.findmybuffet.fragments.FragBuffetContents$LongOperation.doInBackground(FragBuffetContents.java:1) 
05-15 13:41:17.547: E/AndroidRuntime(2743):  at android.os.AsyncTask$2.call(AsyncTask.java:264) 
05-15 13:41:17.547: E/AndroidRuntime(2743):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)** 
+0

您的錯誤是'getDataFromSqlite'方法(來自logcat:'getDataFromSqlite(FragBuffetContents.java:154)'')中第154行的NullPointerException。哪條線? – Fllo

+0

@Fllo .... 154行是cursor.close(); – Devrath

+0

@CasperSkyless,你的sql查詢必須有錯誤,檢查日誌 – gerbit

回答

0

從評論:

154線是cursor.close();

Cursor cursor = null; 

//... 

try { 
    cursor = db.rawQuery(queryString, null); 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    cursor.close(); 
} 

萬一有一個例外,cursornull並試圖調用一個方法上它導致NPE。要麼在try塊中移動cursor.close(),要麼將其與if (cursor != null)條件環繞。

爲什麼輸入rawQuery()是因爲存在SQL語法問題。要獲得幫助,請發佈例外情況,以便登錄catch區塊。