2017-08-20 16 views
2

これは誤りである、それは範囲外のインデックスを言いますが、私はそれを解決する方法を、いくつかのトルコ語の単語がありませんでしたが、彼らは重要ではありません、私は思う:Kotlinのデータベース・エラー・CursorIndexOutOfBoundsException

E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.burhanozen.nothesaplama, PID: 26919 
java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.example.burhanozen.nothesaplama/com.example.burhanozen.nothesaplama.MainActivity}: android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
at ........ 

私はある種の学生情報を保存しようとしていました。私はこれらのエラーがあり、私は以下のコードを共有します。 これは私MainActivityです:

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_main) 
    val toolbar = findViewById(R.id.toolbar) as Toolbar 
    setSupportActionBar(toolbar) 
    val fab = findViewById(R.id.fab) as FloatingActionButton 
    fab.setOnClickListener { 
     val intent = Intent([email protected],NotEkrani::class.java) 
     startActivity(intent) } 


    val studentsArray = ArrayList<String>() 

    val arrayAdapter = ArrayAdapter(this,android.R.layout.simple_list_item_1,studentsArray) 
    listView.adapter= arrayAdapter 

    try{ 

     val myDatabase = this.openOrCreateDatabase("student", Context.MODE_PRIVATE,null) 
     myDatabase.execSQL("CREATE TABLE IF NOT EXISTS students (isim TEXT," + 
       " dersbir TEXT, dersbirkredi TEXT, dersbirort TEXT," + 
       " dersiki TEXT, dersikikredi TEXT, dersikiort TEXT) ") 

     val cursor = myDatabase.rawQuery("select * from students",null) 

     val nameIx = cursor.getColumnIndex("isim") 
     val dersbirIx = cursor.getColumnIndex("dersbir") 
     val dersbirkrediIx = cursor.getColumnIndex("dersbirkredi") 
     val dersbirortIx = cursor.getColumnIndex("dersbirort") 
     val dersikiIx = cursor.getColumnIndex("dersiki") 
     val dersikikrediIx = cursor.getColumnIndex("dersikikredi") 
     val dersikiortIx = cursor.getColumnIndex("dersikiort") 

     cursor.moveToNext() 

     while (cursor != null){ 

      studentsArray.add(cursor.getString(nameIx)) 
      studentsArray.add(cursor.getString(dersbirIx)) 
      studentsArray.add(cursor.getString(dersbirkrediIx)) 
      studentsArray.add(cursor.getString(dersbirortIx)) 
      studentsArray.add(cursor.getString(dersikiIx)) 
      studentsArray.add(cursor.getString(dersikikrediIx)) 
      studentsArray.add(cursor.getString(dersikiortIx)) 

      cursor.moveToNext() 

      arrayAdapter.notifyDataSetChanged() 


     } 
     while (cursor!=null){ 
      cursor!!.close() 
     } 



    }catch (e:SQLException){ 

    } 

そして、これは私の第2の活性ページで、私はここで何らかのエラーができませんでしたが、これは助けることができるかもしれません。私はここにデータベースコードを書いた。

fun kaydet(view:View){ 
    val isim = isim.text.toString() 
    val dersbir = dersbir.text.toString() 
    val dersbirkredi = dersbirkredi.text.toString() 
    val dersbirort = dersbirort.text.toString() 
    val dersiki = dersiki.text.toString() 
    val dersikikredi = dersikikredi.text.toString() 
    val dersikiort = dersikiort.text.toString() 

    try { 
     val myDatabase = openOrCreateDatabase("student", Context.MODE_PRIVATE,null) 

     myDatabase.execSQL("CREATE TABLE IF NOT EXISTS students (isim TEXT," + 
       " dersbir TEXT, dersbirkredi TEXT, dersbirort TEXT," + 
       " dersiki TEXT, dersikikredi TEXT, dersikiort TEXT) ") 

     val sqlString = "INSERT INTO students (isim,dersbir,dersbirkredi,dersbirort,dersiki,dersikikredi,dersikiort) VALUES(?,?,?,?,?,?,?)" 
     val statement = myDatabase.compileStatement(sqlString) 

     statement.bindString(1,isim) 
     statement.bindString(2,dersbir) 
     statement.bindString(3,dersbirkredi) 
     statement.bindString(4,dersbirort) 
     statement.bindString(5,dersiki) 
     statement.bindString(6,dersikikredi) 
     statement.bindString(7,dersikiort) 
     statement.execute() 


    }catch (e:SQLException){ 

    } 
    val intent = Intent(this,MainActivity::class.java) 
    startActivity(intent) 

} 

答えて

1
次のようになりますし、あなたのwhileループを変更

:それはあなたがあなたのwhileループ条件にcursor != nullをチェックされている(あなたのコードから他のすべてのcursor.moveToNext()を削除)

while (cursor.moveToNext()){ 

     studentsArray.add(cursor.getString(nameIx)) 
     ... 


    } 

を、しかし、カーソルからすべての行を読み込んだ後にnullになることはありません。

上記のコードでは、cursor.moveToNextは、次に行がある場合はtrueを返します。それ以外の場合はfalseを返し、ループは終了します。

そして、ちょうど気づいた、あなたがいるかどうかを確認するに

while (cursor!=null){ 
     cursor!!.close() 
} 

、からこれを変更する必要があります。

if (cursor!=null){ 
     cursor.close() 
} 

あるいは、Toddはコメントで示唆されているように、あなたは高階関数を使用することができますがuseは自動的にカーソルを閉じます。これはJava 7のtry-with-resourcesと似ています。

cursor.use { 
    while (cursor.moveToNext()){ 

      studentsArray.add(cursor.getString(nameIx)) 
      ... 


    } 
} 
1

カーソルサイズが1であるため、このエラーが発生しています。データベースには1つのレコードしかありません。しかし、データベースを1回以上クエリしています。それがあなたのエラーの理由です。

まず、実行の完全なコードは間違っています。

アクティビティにデータベースを作成しています。あなたがそうした場合、データベースを適切かつ効率的に管理することはできません。

まず、別のクラスにSqliteOpenHelperデータベースを作成する必要があります。次に、テーブルを作成する必要があります。次にヘルパーメソッドを作成してそこから値を取得して挿入します。

データベースクラスは、次の例のようになります。

class DbHelper(context: Context) : SQLiteOpenHelper(context, "example.db", null, 4) { 
    val TAG = javaClass<DbHelper>().getSimpleName() 
    val TABLE = "logs" 

    companion object { 
     public val ID: String = "_id" 
     public val TIMESTAMP: String = "TIMESTAMP" 
     public val TEXT: String = "TEXT" 
    } 

    val DATABASE_CREATE = 
     "CREATE TABLE if not exists " + TABLE + " (" + 
     "${ID} integer PRIMARY KEY autoincrement," + 
     "${TIMESTAMP} integer," + 
     "${TEXT} text"+ 
     ")" 

    fun log(text: String) { 
     val values = ContentValues() 
     values.put(TEXT, text) 
     values.put(TIMESTAMP, System.currentTimeMillis()) 
     getWritableDatabase().insert(TABLE, null, values); 
    } 

    fun getLogs() : Cursor { 
     return getReadableDatabase() 
       .query(TABLE, arrayOf(ID, TIMESTAMP, TEXT), null, null, null, null, null); 
    } 

    override fun onCreate(db: SQLiteDatabase) { 
     Log.d(TAG, "Creating: " + DATABASE_CREATE); 
     db.execSQL(DATABASE_CREATE) 
    } 

    override fun onUpgrade(p0: SQLiteDatabase, p1: Int, p2: Int) { 
    } 

} 

あなたはKotinデータベースを使用しているのではアンコ - Sqliteをと非常に簡単です。このライブラリによって、データベースからのデータの格納と検索は非常に簡単です。ここで確認できます。 https://github.com/Kotlin/anko/wiki/Anko-SQLite#using-anko-sqlite-in-your-project

関連する問題