Ich versuche Elemente zu einem DB hinzufügen und dann nach einem bestimmten Eintrag suchen. Aber ich bekomme einen Cursorfehler. Hier ist mein Code für die DB-Klasse. Die Datenbank enthält nur eine einzige Spalte. Danke im Voraus.Cursor zurück Fehler
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;
}
}
Die logcat für den folgenden Code ist:
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)
Was möchten Sie erreichen? warum das folgende while (! c.isAfterLast())? – JpCrow
Das war zu überprüfen, ob der Cursor nicht über die letzte Zeile hinaus zeigt! – Vishal
@Vishal hast du irgendwelche Spalten in der Datenbank geändert und diese ausgeführt? Wenn Sie Änderungen an der Datenbank vorgenommen haben, erhöhen Sie zuerst die Datenbankversion und versuchen Sie, die App auszuführen. – Bob