2013-06-28 5 views
0

Я пытаюсь реализовать простой пример DB, используя 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

Cursor из связанного исключения обычно возникает, когда вы пытаетесь получить доступ к позиции курсора, когда не то, что многие строки внутри курсора .print log о количестве строк курсора есть, и если это не 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 

}