2016-05-06 14 views
0

DBに要素を追加して特定のエントリを検索しようとしています。しかし、私はカーソルエラーを取得します。以下はDBクラスのコードです。データベースに含まれる列は1つだけです。前もって感謝します。カーソルがエラーを返す

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です:しばらくは、それは常に後stackoverflowの

を作るtrueになりますので、あなたはカーソルの位置を変えることはありませんすべてで動作していない

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

あなたのクエリを実行するには、カーソルがヌルでなく、次のように最初の位置に移動できるかどうかを尋ねてください:

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

またはあなたの場合、あなたが持っている唯一の列が姓であるので、あなたはこのようにそれを見ることができます:

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

をあなたのデータベースには何も変更する場合は、データベースのバージョンをアップグレードする必要があることを覚えておいてください。

+0

まだ! 同じエラーが発生しています。 – Vishal

+0

が編集されましたが、whileは必要ありません – JpCrow

関連する問題