2016-05-06 2 views
0

Я пытаюсь добавить элементы в БД и затем искать конкретную запись. Но я получаю ошибку курсора. Вот мой код для класса DB. База данных содержит только один столбец. Заранее спасибо.Ошибка возврата курсора

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

/** 
* Created by FanOfCR7 on 16-03-2016. 
*/ 
public class DataB extends SQLiteOpenHelper { 
    private static final String db_name = "testing.db"; 
    private static final int version = 1; 
    private static final String table_name = "students"; 
    private static final String col_name="FirstName"; 
    public DataB(Context context) { 
     super(context, db_name, null, version); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String q = "CREATE TABLE " + table_name + " (FirstName TEXT PRIMARY KEY) "; 
     db.execSQL(q); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS "+table_name); 
     onCreate(db); 
    } 
    public int addData(String name) 
    { 
     ContentValues cv = new ContentValues(); 
     cv.put(col_name, name); 
     SQLiteDatabase db = this.getWritableDatabase(); 
     db.insert(table_name, null, cv); 
     db.close(); 
     return 1; 
    } 
    public String search(String string) 
    { 
     String dbstring=" "; 
     SQLiteDatabase db = this.getWritableDatabase(); 
     String query = "SELECT * FROM "+ table_name + " WHERE FirstName = '" + string+"'"; 
     Cursor c = db.rawQuery(query,null); 
     c.moveToFirst(); 
     while(!c.isAfterLast()) 
     { 
      if(c.getString(c.getColumnIndex("FirstName"))!=null) 
      { 
       dbstring = c.getString(c.getColumnIndex("FirstName")); 
      } 
     } 
     return dbstring; 
    } 
} 

LogCat на следующий код:

E/AndroidRuntime: FATAL EXCEPTION: main 
java.lang.IllegalStateException: Could not execute method for android:onClick 
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:275) 
    at android.view.View.performClick(View.java:3574) 
    at android.view.View$PerformClick.run(View.java:14293) 
    at android.os.Handler.handleCallback(Handler.java:605) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4448) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270) 
    at android.view.View.performClick(View.java:3574)  
    at android.view.View$PerformClick.run(View.java:14293)  
    at android.os.Handler.handleCallback(Handler.java:605)  
    at android.os.Handler.dispatchMessage(Handler.java:92)  
    at android.os.Looper.loop(Looper.java:137)  
    at android.app.ActivityThread.main(ActivityThread.java:4448)  
    at java.lang.reflect.Method.invokeNative(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:511)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)  
    at dalvik.system.NativeStart.main(Native Method)  
Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 
    at android.database.CursorWindow.nativeGetString(Native Method) 
    at android.database.CursorWindow.getString(CursorWindow.java:442) 
    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 
    at com.example.cr7.cyber.DataB.search(DataB.java:51) 
    at com.example.cr7.cyber.MainActivity.searchData(MainActivity.java:39) 
    at java.lang.reflect.Method.invokeNative(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:511)  
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)  
    at android.view.View.performClick(View.java:3574)  
    at android.view.View$PerformClick.run(View.java:14293)  
    at android.os.Handler.handleCallback(Handler.java:605)  
    at android.os.Handler.dispatchMessage(Handler.java:92)  
    at android.os.Looper.loop(Looper.java:137)  
    at android.app.ActivityThread.main(ActivityThread.java:4448)  
    at java.lang.reflect.Method.invokeNative(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:511)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)  
    at dalvik.system.NativeStart.main(Native Method)  
+0

Что вы пытаетесь усвоить? почему следующее while (! c.isAfterLast())? – JpCrow

+0

Это должно было проверить, не указывает ли курсор за пределы последней строки! – Vishal

+0

@Vishal вы изменили какие-либо столбцы в базе данных и запустили это? Если вы внесли какие-либо изменения в базу данных, сначала увеличьте версию базы данных и попробуйте запустить приложение. – Bob

ответ

0

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

После выполнив ваш запрос, вы должны спросить, не является ли курсор неправильным и может ли он перейти в первую позицию, например:

if(c != null && c.moveToFirst()){  
     dbstring = c.getString(c.getColumnIndex(col_name));   
    } 

Или в вашем случае, потому что единственный столбец у вас есть FirstName вы можете посмотреть его, как это:

if(c != null && c.moveToFirst()){  
     dbstring = c.getString(0);   
    } 

Помните, что если вы что-либо изменить в вашей базе данных, необходимо обновить версию базы данных.

+0

Еще! получить ту же ошибку! – Vishal

+0

отредактировано, пока не требуется – JpCrow

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