2012-10-18 22 views
1

我的MapActivity中有一个AsyncTask类。在doInBacground()方法中,我必须编码块。逻辑上正确,但'如果声明'与使我的应用程序崩溃的方法

它看起来像这样:

 @Override 
     protected List<GeoPoint> doInBackground(String... arg0) { 


      // check if the query (word and the distance) existing queries and return its id 
      int checkQuery = db.getQueryMatch(arg0[3].toString() , arg0[2].toString()); 
      Log.v(" CheckQuery int ", " equal? " + checkQuery); 

      if (checkQuery < 1) 
      { 
       Block 1 
      } 
      else 
      { 
       Block 2 
      } 

getQueryMatch方法检查两个文本字段存在,则返回记录ID。

int getQueryMatch(String word, String meter) { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    int getidd = 0; 
    Cursor cursor = db.query(TABLE_HISTORY, new String[] { KEY_ID, QUERYWORD, DISTANCEQ, KEY_TIMESTAMP }, QUERYWORD + "=? AND " + DISTANCEQ + "=?", new String[] { word, meter }, null, null, null, null); 
    //String selectQuery = "SELECT * FROM " + TABLE_HISTORY + " WHERE " + QUERYWORD + "= '" + word + "' AND " + DISTANCEQ + "= '"+ meter +"'" ; 
    if (cursor != null) 
     cursor.moveToFirst(); 
    getidd = Integer.parseInt(cursor.getString(0)); 

    db.close(); // Closing database connection 

    // return History 
    return getidd; 
} 

当我测试了它没有if语句中的AsyncTask类,它工作得很好。如果返回的值为0,则会导致应用程序崩溃。 因此,如果没有从数据库中找到记录(由getQueryMatch检查),则要运行块1,否则请运行块2.

此处是错误:

10-19 02:47:50.464: E/AndroidRuntime(11967): FATAL EXCEPTION: AsyncTask #2 
10-19 02:47:50.464: E/AndroidRuntime(11967): java.lang.RuntimeException: An error occured while executing doInBackground() 
10-19 02:47:50.464: E/AndroidRuntime(11967): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
10-19 02:47:50.464: E/AndroidRuntime(11967): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
10-19 02:47:50.464: E/AndroidRuntime(11967): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
10-19 02:47:50.464: E/AndroidRuntime(11967): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
10-19 02:47:50.464: E/AndroidRuntime(11967): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
10-19 02:47:50.464: E/AndroidRuntime(11967): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
10-19 02:47:50.464: E/AndroidRuntime(11967): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
10-19 02:47:50.464: E/AndroidRuntime(11967): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
10-19 02:47:50.464: E/AndroidRuntime(11967): at java.lang.Thread.run(Thread.java:856) 
10-19 02:47:50.464: E/AndroidRuntime(11967): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 
10-19 02:47:50.464: E/AndroidRuntime(11967): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:418) 
10-19 02:47:50.464: E/AndroidRuntime(11967): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136) 
10-19 02:47:50.464: E/AndroidRuntime(11967): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50) 
10-19 02:47:50.464: E/AndroidRuntime(11967): at com.example.phooogle.DatabaseHandler.getQueryMatch(DatabaseHandler.java:148) 
10-19 02:47:50.464: E/AndroidRuntime(11967): at com.example.phooogle.GoogleMapsAppActivity$InitTask.doInBackground(GoogleMapsAppActivity.java:142) 
10-19 02:47:50.464: E/AndroidRuntime(11967): at com.example.phooogle.GoogleMapsAppActivity$InitTask.doInBackground(GoogleMapsAppActivity.java:1) 
10-19 02:47:50.464: E/AndroidRuntime(11967): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
10-19 02:47:50.464: E/AndroidRuntime(11967): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 

对我来说这是逻辑上真实的,但不工作!

回答

5

您需要检查movetofirst返回的值。如果光标是空的返回false

​​

编辑:

getidd = -1; 
if (cursor != null){ 
    boolean notEmpty = cursor.moveToFirst(); 
    if(notEmpty) 
     getidd = Integer.parseInt(cursor.getString(0));  
} 
db.close(); // Closing database connection 
// return History 
return getidd; 
+0

在这种情况下,如果它是真的我可以返回的ID? – iAziz

+1

检查编辑。 – nandeesh

+0

对不起,我不得不改变别的东西,现在它工作得很完美。谢谢sooo多:) – iAziz

0

显然,cursor.getString(0)失败,因为没有任何数据。

您也必须检查返回值cursor.moveToFirst()

+0

我这样做。在方法中看到这一行:if(cursor!= null) cursor.moveToFirst(); – iAziz

相关问题