Я пытаюсь добавить элементы в БД и затем искать конкретную запись. Но я получаю ошибку курсора. Вот мой код для класса 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)
Что вы пытаетесь усвоить? почему следующее while (! c.isAfterLast())? – JpCrow
Это должно было проверить, не указывает ли курсор за пределы последней строки! – Vishal
@Vishal вы изменили какие-либо столбцы в базе данных и запустили это? Если вы внесли какие-либо изменения в базу данных, сначала увеличьте версию базы данных и попробуйте запустить приложение. – Bob