2014-01-13 4 views
-1

Я пытаюсь использовать базу данных sqlite для android.Below - это мой SQL-помощник, который я использую для доступа к базе данных sqlite.ошибка в sqlite android при попытке доступа к базе данных

public class SQLHelper extends SQLiteOpenHelper{ 
static final String TABLE_NAME = "itemDetail"; 
static final String ID ="id INTEGER PRIMARY KEY AUTOINCREMENT"; 
static final String ITEM = "item"; 
static final String QUANTITY = "quantity"; 
static final String CREATE_TABLE = "CREATE TABLE "+SQLHelper.TABLE_NAME+"(" + ID +" , "+SQLHelper.ITEM+" TEXT "+" , "+SQLHelper.QUANTITY+" INTEGER"+")"; 
static final String DB_NAME = "mydb"; 

public SQLHelper(Context context, int version) { 
    super(context, DB_NAME, null, 1); 
    // TODO Auto-generated constructor stub 
} 

@Override 
public void onCreate(SQLiteDatabase arg0) { 
    // TODO Auto-generated method stub 
    arg0.execSQL(CREATE_TABLE); 
} 

@Override 
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { 
    // TODO Auto-generated method stub 
    arg0.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME); 

    // create fresh books table 
    this.onCreate(arg0); 
} 



public long add(String item , String q){ 

    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(ITEM, item); 
    values.put(QUANTITY , q); 
    long newr = db.insert(TABLE_NAME, "null", values); 

    db.close(); 
    return newr; 
} 
public Cursor read(){ 
    Cursor cc; 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Log.d("report","ok"); 
    cc=db.rawQuery("SELECT * FROM itemDetail", null); 
    Log.d("report","ok2"); 
    db.close(); 
    //cc.moveToFirst(); 
    Log.d("good",cc.getString(1)); 
    return cc; 

} 

}

когда-либо я использовать куб.см (объект Cursor), чтобы получить доступ строки, возвращаемые командой запроса прекращается моя программа. Я думаю, что rawQuery не возвращает ни одной строки. пожалуйста help.thanks

LogCat

01-13 22:12:37.921: E/AndroidRuntime(341): Caused by:  android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 23 
01-13 22:12:37.921: E/AndroidRuntime(341):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580) 
01-13 22:12:37.921: E/AndroidRuntime(341):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214) 
01-13 22:12:37.921: E/AndroidRuntime(341):  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41) 
    01-13 22:12:37.921: E/AndroidRuntime(341): at it.is.appone.SQLHelper.read(SQLHelper.java:63) 
01-13 22:12:37.921: E/AndroidRuntime(341):  at it.is.appone.Report.show(Report.java:36) 
    01-13 22:12:37.921: E/AndroidRuntime(341): ... 14 more 

ниже функции в классе деятельности, из которого я пытаюсь получить доступ к базе данных.

public void show(View view){ 
    //Toast.makeText(this, "in show", 5000).show(); 
    SQLHelper myh = new SQLHelper(this,dbversion); 
    SQLiteCursor cc=(SQLiteCursor) myh.read(); 
    //readDB(); 

    Log.d("Report5"," in report"); 
    String text = new String(); 
    try{ 
    if(cc != null){ 
     cc.moveToFirst(); 
     text = cc.getString(1); 
    } 
    else 
    { 
     text = "bad"; 
    } 
    }catch(Exception e){ 
     Toast.makeText(this, e.getMessage(), 5000); 
    } 

    Log.d("report data base", text); 

    /*while (!cc.isAfterLast()){ 
     String t = cc.getString(cc.getColumnIndexOrThrow(SQLHelper.ITEM)); 
     text = text + t; 
    }*/ 
    //Toast.makeText(this, "everthing ok", 5000).show(); 

} 
+2

1. Опубликовать исключение stacktrace из logcat. 2. Отправьте код, где это происходит. 3. Только закрывайте() базу данных, когда вы ее используете. – laalto

+2

Фрагменты кода и stacktrace не согласны. Исключение означает, что вы забыли переместить курсор в допустимую строку. – laalto

+0

Как я могу переместить курсор в действительную строку? спасибо за ответ – user3190959

ответ

0

пожалуйста, проверьте всегда курсор, что он не должен быть пустым, для этого используют следующий код ...

if (cursor != null) 
     cursor.moveToFirst(); 

вы закрыли

db.close(); 

перед тем, как курсор, как well.close db после закрытия курсора

отправьте дополнительную информацию о логарифме и точной ошибке lem

+1

курсор не может быть нулевым. http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#rawQuery(java.lang.String, java.lang.String []) – Raghunandan

+0

yes isolutely correct, и мы должны проверить его, если (курсор ! = null) cursor.moveToFirst(); для согласованности и обработки ошибок –

+2

неправильно. см. документы. курсор не будет равен нулю. вам нужно только 'if (cursor.moveToFirst())'. Я также совершил ту же ошибку, но Зельвин указал на мою ошибку, и я снова проверил документы. http://stackoverflow.com/questions/20910152/android-sqlite-cursoroutofboundsexception/20910179#20910179 – Raghunandan

Смежные вопросы