2011-07-27 6 views
0

SQLiteからフィールドIDと8個のフィールド文字列で照会しています(一部はnull可能です)。 EditTextオブジェクト(自動検索)に変更状態があるたびにトリガされるメソッドgetSearchedItemsFromSQLiteがあります。これらのエラーメッセージはランダムに表示されますが、アプリケーションは全くクラッシュしません。高速クエリー時にCursorIndexOutOfBoundsExceptionが発生しました

07-27 18:24:52.619: ERROR/AndroidRuntime(1173): ERROR: thread attach failed 
    07-27 18:24:55.188: ERROR/AndroidRuntime(1184): ERROR: thread attach failed 
    07-27 18:25:18.649: ERROR/GuitarTabs(1191): getSearchedItemsFromSQLite: Handler for DB + cursor: Index 6 requested, with a size of 6 


    07-27 18:25:18.659: WARN/System.err(1191): android.database.CursorIndexOutOfBoundsException: Index 6 requested, with a size of 6 
    07-27 18:25:18.889: WARN/System.err(1191):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580) 
    07-27 18:25:18.889: WARN/System.err(1191):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214) 
    07-27 18:25:18.889: WARN/System.err(1191):  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41) 
    07-27 18:25:18.889: WARN/System.err(1191):  at com.package.project.activity.ItemBrowserActivity.getSearchedItemsFromSQLite(ItemBrowserActivity.java:351) 
    07-27 18:25:18.889: WARN/System.err(1191):  at com.package.project.activity.ItemBrowserActivity$AppInitialization.doInBackground(ItemBrowserActivity.java:199) 
    07-27 18:25:18.889: WARN/System.err(1191):  at com.package.project.activity.ItemBrowserActivity$AppInitialization.doInBackground(ItemBrowserActivity.java:1) 
    07-27 18:25:18.889: WARN/System.err(1191):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
    07-27 18:25:18.899: WARN/System.err(1191):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
    07-27 18:25:18.909: WARN/System.err(1191):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
    07-27 18:25:18.909: WARN/System.err(1191):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
    07-27 18:25:18.909: WARN/System.err(1191):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
    07-27 18:25:18.909: WARN/System.err(1191):  at java.lang.Thread.run(Thread.java:1096) 

どうすれば解決できますか?ここで

は、メソッドのコードスニペットです:

 dbHelper.open(); 
     cursor = dbHelper.fetchAllTabs(fetchMethod); 
     startManagingCursor(cursor); 
     if(cursor != null && cursor.getCount() > 0) { 
      if(cursor.moveToFirst()) { 
       while (cursor.isAfterLast() == false) { 
        if(cursor.getColumnCount() > 0) { 
         Log.i(logAppName, "/ - Column count is: " + cursor.getColumnCount()); 
         if(!cursor.isNull(0) && !cursor.isNull(1)) { 
          if(!cursor.isNull(0)) { 
           ListedItem tab = new ListedItem(); 
           tab.setSongID(cursor.getInt(0)); 
           if(!cursor.isNull(1)) tab.setTitle(cursor.getString(1)); 
           if(!cursor.isNull(2)) tab.setArtist(cursor.getString(2)); 
           if(!cursor.isNull(3)) tab.setDifficulty(cursor.getString(3)); 
           if(!cursor.isNull(4)) tab.setGenre(cursor.getString(4)); 
           if(!cursor.isNull(5)) tab.setFilename(cursor.getString(5)); 
           if(!cursor.isNull(6)) tab.setFileformat(cursor.getString(6)); 
           if(!cursor.isNull(7)) tab.setSource(cursor.getString(7)); 
           if(!cursor.isNull(8)) tab.setDeleted(cursor.getString(8)); 
           if(Integer.parseInt(tab.getDeleted()) == 0) 
            ret.add(tab); 
           else 
            Log.i(logAppName, "Not adding tab: " + tab.getSongTitle() + " (" + tab.getSongFilename() + ") " + "since it's already deleted."); 
           cursor.moveToNext(); 
          } else { 
           Log.i(logAppName, "x - ID is null."); 
          } 
         } else { 
          Log.i(logAppName, "x - Either id or title is null."); 
         } 
        } else { 
         Log.i(logAppName, "x - Column count is: " + cursor.getColumnCount()); 
        } 
       } 
      }  
      if(cursor != null) 
       cursor.close(); 
+1

まあ、エラーメッセージに従って、カーソルはインデックス6にアクセスしようとしますが、あなたのcurso rはインデックス[0,5]のみを含む。クエリが実際に必要な列の数を返すかどうかを確認します。 Log.i(logAppName、 "/ - Column count is:" + cursor.getColumnCount()) – Entreco

+0

これは、高速クエリーでは、editTextにuを入力すると、 editTextの値が変わるたびに常にqueryメソッドを呼び出すため、メソッドは実際には再び呼び出されたときに処理を完了することはありません。 このエラーはエミュレータでのみ発生し、デバイスでこれをテストしたところ、エラーはまったく再現できませんでした。 エミュレータにはSQLiteに関する制限がありますか? – eunique0216

答えて

1

私はこれらの条件を追加しました:その後

if (cursor != null && cursor.getCount() > 0) { 
    totalRows = cursor.getCount(); 
if(cursor.moveToFirst()) { 
    while (cursor.isAfterLast() == false) { 
     if(cursor.getColumnCount() > 0) { 
       ... 

を、私は以前のプロセスが別を通過する前に最初に仕上げることができるように、スリープスレッドを追加しましたプロセス:

private boolean processing = false; 
... 

int ctr = 0; 
// added fix to avoid error on cursor 
while(processing) { 
    try { 
    Log.i(logAppName, "Still processing. Count: " + ctr + ". Is processing? " + processing); 
     ctr++; 
     Thread.sleep(500); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    if(ctr > 5) { 
     break; 
    } 
} 
関連する問題