Android游标索引越界异常

时间:2012-04-28 14:54:59

标签: android gridview indexing cursor bind

我需要在Android中使用simplecursor适配器绑定gridview,这是我的代码:

 public class AndroidSqliteActivity extends Activity {
private Veritabani ogrenciler; 
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);      
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.main);
    ogrenciler = new Veritabani(this);       
    final EditText adi=(EditText) findViewById(R.id.editText1); 
    final EditText soyadi=(EditText) findViewById(R.id.editText2);    
    Button verigonder=(Button) findViewById(R.id.verigonder);  
    Button button1 =(Button) findViewById(R.id.button1); 
    button1.setOnClickListener(new View.OnClickListener() {        
        public void onClick(View v) { 
            try{

            Intent i = new Intent(AndroidSqliteActivity.this, AndroidVeriActivity.class);
            startActivity(i);
            }
            catch(RuntimeException e)
            {
                Log.e("ERROR", "ERROR IN CODE: " + e.toString());

            }

        }
        });
    verigonder.setOnClickListener(new View.OnClickListener() {        
        public void onClick(View v) { 
            try{                 
                KayitEkle(adi.getText().toString(),soyadi.getText().toString()); 
                Cursor cursor = KayitGetir();  
                KayitGoster(cursor);        
                }
            catch (SQLiteException e) {  

                             Log.d("eHata", e.getLocalizedMessage());  
                         }  
            finally{            
                ogrenciler.close();    
                }             
            }        
        });    
    } 
private void KayitEkle(String isim, String soyad){     
    SQLiteDatabase db = ogrenciler.getWritableDatabase(); 
    ContentValues veriler = new ContentValues();    
    veriler.put("isim", isim);     
    veriler.put("soyad",soyad); 
    db.insertOrThrow("ogrenciisim", null, veriler);    
    } 

private Cursor KayitGetir(){  
    SQLiteDatabase db = ogrenciler.getReadableDatabase();  
    Cursor cursor = db.query("ogrenciisim", new String[] {"id", "isim", "soyad"}, null, null, null, null, null);  
    startManagingCursor(cursor);      
    return cursor;    
    } 
private void KayitGoster(Cursor cursor){ 

    try{
    final GridView grid=(GridView) findViewById(R.id.gridView1); 

    String[] columns = new String[] { "id", "isim", "soyad" };
    int[] to = new int[] { R.id.textView122, R.id.textView222, R.id.textView322 }; 
    SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.gridview, cursor, columns, to);  
    grid.setAdapter(mAdapter);
    }
    catch(Exception e)
    {
        Log.d("eHata", e.getLocalizedMessage());  
    }
    } 

}

这是我的数据库类:

public class Veritabani extends SQLiteOpenHelper {
private static final String VERITABANI = "Ogrenciler";
private static final int SURUM = 1;

public Veritabani(Context con)
{
super (con,VERITABANI,null,SURUM);
}

@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table ogrenciisim(id integer primary key, isim text, soyad text);");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exist ogrenciisim");
onCreate(db);

}
}

但它给出了一个错误“索引-1请求大小为18(16-20)”我做错了什么?

PS:我改变了它,就像Barak提到的那样,但现在它给出了错误:“列id不存在” 非常感谢

1 个答案:

答案 0 :(得分:0)

你没有正确设置。

此:

String[] columns = new String[] {
        cursor.getString((cursor.getColumnIndex("id"))), 
        cursor.getString((cursor.getColumnIndex("isim"))), 
        cursor.getString((cursor.getColumnIndex("soyad"))) };

应该是这样的:

String[] columns = new String[] { "id", "isim", "soyad" };

您的实现正在尝试从游标中读取值。适配器将读取光标,您只需要告诉它将哪些列放入哪些资源。

修改

好的,这是一个猜测,但看着你的代码,我认为是一个坚实的代码。

您根据我的建议(修复空间问题)更改了数据库结构,但实际上并未将数据库结构更改为数据库版本,因此onUpgrade方法未触发,重新创建了数据库。

改变这个:

private static final int SURUM = 1;

对此:

private static final int SURUM = 2;

运行应用程序,您的数据库将使用新的(正确的)结构重新创建。这应该解决问题,因为它无法找到该列。

你提到的另一个错误“但是它给出了一个大小为18(16-20)的错误索引-1”通常意味着你试图在没有先执行cursor.moveToFirst的情况下访问游标...但是我没有从你发布的代码中看到可能发生的地方。您可以尝试将它作为gridview的try语句中的第一个内容(或者在创建它之前使用startManagingCursor之后再执行它)