2016-05-06 3 views
0

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)  
+0

Was möchten Sie erreichen? warum das folgende while (! c.isAfterLast())? – JpCrow

+0

Das war zu überprüfen, ob der Cursor nicht über die letzte Zeile hinaus zeigt! – Vishal

+0

@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

Antwort

0

Die während der Arbeit nicht überhaupt werden Sie nie die Cursorposition zu ändern, so dass es immer wahr sein wird, ein Stackoverflow

Nachdem Wenn Sie Ihre Abfrage durchführen, sollten Sie fragen, ob der Cursor nicht Null ist und ob er sich wie folgt an die erste Position bewegen kann:

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

Oder in Ihrem Fall, weil die einzige Spalte, die Sie haben, ist First Sie es wie folgt aussehen:

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

dass Denken Sie daran, wenn Sie etwas in Ihrer Datenbank ändern, sollten Sie die Datenbankversion aktualisieren.

+0

Noch! bekommen den gleichen Fehler! – Vishal

+0

bearbeitet, die while ist nicht notwendig – JpCrow