2012-09-14 92 views
-2

我正在學習Android與SQLite操作。下面的代碼導致CursorIndexOutOfBoundsException,但我不知道爲什麼:android.database.CursorIndexOutOfBoundsException:索引10請求,大小爲10

for (int i = 0; i < cursor.getCount(); i++) { 
    cursor.move(i); 
    String username = cursor.getString(1); 
    Log.i("username", username); 
} 

日誌和異常:

09-13 12:39:18.317: INFO/row count:(3578): 10 
09-13 12:39:18.317: INFO/username(3578): aaa_0 
09-13 12:39:18.317: INFO/username(3578): aaa_1 
09-13 12:39:18.317: INFO/username(3578): aaa_3 
09-13 12:39:18.317: INFO/username(3578): aaa_6 
09-13 12:39:18.337: ERROR/AndroidRuntime(3578): FATAL EXCEPTION: main 
    java.lang.RuntimeException: 
    Unable to start activity ComponentInfo{com.example/com.example.MyActivity}: 
    android.database.CursorIndexOutOfBoundsException: 
    Index 10 requested, with a size of 10 

你可以看到行數爲10,但得到的時候拋出異常第五排。

完整的代碼是:

import android.app.Activity; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.util.Log; 

public class MyActivity extends Activity { 

    private SQLiteDatabase db; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     createTables(); 
     insertData(); 
     queryData(); 
    } 


    private void queryData() { 
     Cursor cursor = db.query("users", new String[]{"_id", "username", "password"}, null, null, null, null, null, null); 
     if (cursor.moveToFirst()) { 
      Log.i("row count: ", "" + cursor.getCount()); 
      for (int i = 0; i < cursor.getCount(); i++) { 
       cursor.move(i); 
       String username = cursor.getString(1); 
       Log.i("username", username); 
      } 
     } 
    } 

    private void insertData() { 
     for (int i = 0; i < 10; i++) { 
      String sql = "insert into users(username, password) values('aaa_" + i + "','123_" + i + "')"; 
      db.execSQL(sql); 
     } 
    } 

    private void createTables() { 
     this.deleteDatabase("temp.db"); 
     db = this.openOrCreateDatabase("temp.db", MODE_PRIVATE, null); 
     String sql = "create table users(_id integer primary key autoincrement, username text, password text)"; 
     db.execSQL(sql); 
    } 

} 

回答

3

這是因爲move(int offset)執行此:由相對量

將光標移動,向前或向後,從當前位置

+0

謝謝你,我使用的代碼來自(壞)安卓手冊,我從來沒有意識到這種方法被濫用。 – Freewind

2

您不應該使用move api。這是將位置移動一個偏移量。而是使用

Cursor.moveToPosition 
2

嘗試......

 cursor.moveToFirst(); 
    for (int i = 0; i < cursor.getCount(); i++) 
     {   
      String username = cursor.getString(1); 
      Log.i("username", username); 
      cursor.moveToNext() 
     } 

或按你的代碼...

private void queryData() { 
     Cursor cursor = db.query("users", new String[]{"_id", "username", "password"}, null, null, null, null, null, null); 
     if (cursor.moveToFirst()) { 
      Log.i("row count: ", "" + cursor.getCount()); 
      for (int i = 0; i < cursor.getCount(); i++) {     
       String username = cursor.getString(1); 
       Log.i("username", username); 
       cursor.moveToNext() 
      } 
     } 
    } 
2

使用do while循環而非for循環。

if (cursor.getCount() != 0) 
{ 
    if (cursor.moveToFirst()) 
    { 
     do 
     { 
      // cursor.getString(cursor.getColumnIndex("username")));    
     } while (cursor.moveToNext()); 
    } 
} 
+0

不需要做cursor.moveToFirst();只需用cursor.moveToNext()包裝整個事物; – Carnal

相關問題