0

作成したデータベースと、リスト ビューを使用するリスト クラスがあります。リストから項目を選択しようとすると、クラッシュして次のエラーが表示されるという問題が発生しています: 11-03 19:57:16.064: E/AndroidRuntime(27491): FATAL EXCEPTION: main 11-03 19 :57:16.064: E/AndroidRuntime(27491): android.database.CursorIndexOutOfBoundsException: サイズ 0 のインデックス 0 が要求されました

カーソルが情報を取得しているかどうかを確認するためにログに出力しましたが、ゼロが返されたので、そうではないことがわかりました。多くの形式の where 句を試しましたが、すべて同じエラーが返されます。あなたが与えることができるどんな助けも大歓迎です。

データベースコードは次のとおりです。

import java.util.ArrayList;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


public class DataBaseWish extends SQLiteOpenHelper
{
    public static final int VERSION = 1;
    public static final String TABLE_NAME = "WishList";
    public static final String DBNAME = "wishList.sqlite";
    public static final String ID = "id"; 
    public static final String BOOK = "book";
    static SQLiteDatabase db1;

    public DataBaseWish(Context context)
    {
        super(context, DBNAME, null, VERSION);
        // TODO Auto-generated constructor stub
    }


    @Override
    public void onCreate(SQLiteDatabase db1)
    {
        // TODO Auto-generated method stub
        createDatabase(db1);
    }
    private void createDatabase(SQLiteDatabase db1)
    {
        db1.execSQL("create table " + TABLE_NAME + "(" + ID + " integer primary key autoincrement not null, " + BOOK + " text " + ");");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db1, int oldVersion, int newVersion) 
    {
        // TODO Auto-generated method stub
        db1.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db1);
    }
    public void Insert(String book)
    {
        ContentValues values = new ContentValues();
        values.put(BOOK, book);
        db1.insert(TABLE_NAME, null, values);
    }
    public void deleteItem(String book)
    {
        db1.delete(TABLE_NAME, ID, new String[] {book});
    }
    public ArrayList<String> get()
    {
        String[] column = new String[] {BOOK};
        Cursor c = db1.query(TABLE_NAME, column, null, null, null, null, null);
        ArrayList<String> result = new ArrayList<String>();
        c.moveToFirst();
        while(!c.isAfterLast())
        {
            result.add(c.getString(0));
            c.moveToNext();
        }
        return result;
    }
    public String getBook(Cursor c)
    {
        return(c.getString(0));
    }
    public Cursor getID(String book)
    {
        String[] args = {book};
        String[] column = new String[] {BOOK};
        Log.w("Print",args[0]);
        return(db1.query(TABLE_NAME, column, "id='0'", null, null, null, null));
        //return(db1.rawQuery("SELECT id, book FROM WishList WHERE id="+ book, null));
    }
    public void close()
    {
        db1.close();
    }
    public void open()
    {
        db1 = this.getWritableDatabase();
    }
}

リストの選択クリックにアクセスする方法は次のとおりです。

lv.setOnItemClickListener(new OnItemClickListener()
        {
            public void onItemClick(AdapterView<?> adapter, View view, int position, long id)
            {
                dbo.open();
                dbID = String.valueOf(id);
                Cursor c = dbo.getID(dbID);
                Log.w("whishlist", "Cursor size is:"+c.getCount());
                c.moveToFirst();
                item.setText(dbo.getBook(c));
                dbo.close();
            }
        });
4

1 に答える 1

1

ID 列は 0 ではなく 1 で始まりますが、getID() メソッドで id=0 のチェックをハードコーディングしたため、返されたカーソルは空です。ちなみに、カーソルが空かどうかは、Cursor の moveToFirst() メソッドが返す値を見ることで確認できます。false の場合、カーソルは空です。コメント行は機能しますが、選択クエリの「id」列を削除する必要があります。削除しないと、「book」ではなく「id」列にアクセスするため、getBook メソッドが失敗します。

于 2013-11-04T04:59:30.837 に答える