2013-06-28 86 views
0

我試圖用SQLITE實現一個簡單的數據庫示例。這裏是我的代碼Android中的遊標索引異常SQLITE

package com.example.dbex; 

import java.sql.SQLOutput; 
import java.sql.SQLPermission; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DBHandler extends SQLiteOpenHelper { 

    public static final int DATABASE_VERSION=1; 
    public static final String DATABASE_NAME="contactsmanager"; 
    public static final String TABLE_CONTACTS="contacts"; 
    public static final String KEY_ID="id"; 
    public static final String KEY_NAME="name"; 
    public static final String KEY_NUMBER="number"; 
    public DBHandler(Context context) { 
     super(context,DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     String CREATE_TABLE_CONTACTS="CREATE TABLE "+TABLE_CONTACTS+"("+KEY_ID+" INTEGER PRIMARY KEY,"+KEY_NAME+" TEXT,"+KEY_NUMBER+" TEXT"+")"; 
     db.execSQL(CREATE_TABLE_CONTACTS); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXISTS "+TABLE_CONTACTS); 
     onCreate(db); 
    } 

    public void addContact(Contacts contacts) 
    { 
     SQLiteDatabase db=this.getWritableDatabase(); 
     ContentValues values=new ContentValues(); 
     values.put(KEY_NAME, contacts.getname()); 
     values.put(KEY_NUMBER, contacts.getnumber()); 
     db.insert(TABLE_CONTACTS,null,values); 
     db.close(); 
    } 

    public Contacts getContact(int id) 
    { 
     SQLiteDatabase db=this.getReadableDatabase(); 
     Cursor c=db.query(TABLE_CONTACTS, new String[]{KEY_ID,KEY_NAME,KEY_NUMBER},KEY_ID+" =?",new String[]{String.valueOf(id)}, null, null, null, null); 
     if(c!=null) 
     { 
      c.moveToFirst(); 
     } 
     Contacts contacts=new Contacts(Integer.parseInt(c.getString(0)),c.getString(1),c.getString(2)); 
     return contacts; 
    } 

    public void deleteContact(Contacts contacts) 
    { 
     SQLiteDatabase db=this.getWritableDatabase(); 
     db.delete(TABLE_CONTACTS, KEY_ID+" =?", new String[]{String.valueOf(contacts.getID())}); 
     db.close(); 
    } 


} 

`

我就行了

Contacts contacts=new Contacts(Integer.parseInt(c.getString(0)),c.getString(1),c.getString(2)); 

我要去哪裏錯了得到一個光標出界異常的?

回答

1

您的光標可能爲空。

它可以不爲空,但仍然沒有結果(返回0行)。你可以確保你訪問它,只有當它改變你的邏輯有結果:

Contact contacts = null; 
if (c!=null && c.moveToFirst()) { 
    contacts = new Contacts(Integer.parseInt(c.getString(0)),c.getString(1),c.getString(2)); 
} 
return contacts; 
0

光標出界異常,當您嘗試訪問光標位置時,沒有光標.PRINT裏面很多行一般都自帶記錄遊標的行數,如果不是0,則只能訪問更多的行。

0

嘗試以下

Contacts getContact(int id) { 
    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID, 
      KEY_NAME, KEY_NUMBER }, KEY_ID + "=?", 
      new String[] { String.valueOf(id) }, null, null, null, null); 
    Contacts contacts; 
    if (cursor != null) 
    { 
    cursor.moveToFirst(); 
    contacts = new Contacts(Integer.parseInt(cursor.getString(0)), 
      cursor.getString(1), cursor.getString(2)); 
    } 
    return contacts 

}