0

私は DatabaseHandler でこのコードを使用しています:

public class DatabaseHandler extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "wic";
    private static final String TABLE_NAME = "products";
    private static final String KEY_NAME = "pname";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        String CREATE_PRODUCTS_TABLE = "CREATE TABLE " + TABLE_NAME + "("
                + KEY_NAME + " TEXT" + ")";
        db.execSQL(CREATE_PRODUCTS_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);

        // Create tables again
        onCreate(db);
    }

    public void addProducts(String product_name) {

        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, product_name); // Product Name
        // Inserting Row
        db.insert(TABLE_NAME, null, values);
        db.close(); // Closing database connection
    }

    public String getProducts() {

        SQLiteDatabase db = this.getReadableDatabase();
        String selectQuery = "SELECT  * FROM " + TABLE_NAME;
        Cursor cursor = db.rawQuery(selectQuery, null);
        String s = "default";
        if (cursor.moveToFirst()) {
            int n = cursor.getCount();
            Log.d("cursor count", "++  " + n);
            s = cursor.getString(0);
        }
        cursor.close();
        return s;
    }
}

データベースに文字列を1つだけ追加しています。これを使用して:

DatabaseHandler db = new DatabaseHandler(this);
db.addProducts("1st product");

しかし、私はこの例外を受け取ります:

android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 5120

追加中ではなく、使用して値を取得しようとするときdb.getProducts();

cursor.getCounts値 = 5120 が得られます。

私はAndroidで初めてSQLiteを使用していますが、これについてはわかりません:

ありがとうございました

4

3 に答える 3

3

不足している行は、

cursor.moveToFirst();

コード内の何か:

Cursor cursor = db.rawQuery(selectQuery, null);
int n = cursor.getCount();
cursor.moveToFirst();
int n = cursor.getCount();
String s = cursor.getString(0);
于 2012-08-31T12:10:53.853 に答える
2

if 条件を追加する必要があります。

if(cursor.moveToFirst()) {
    int n = cursor.getCount();
    String s = cursor.getString(0);
}

なんで?Cursors (最初は) 行インデックス -1 (最初の行の前) から始まります。そのため、 willを呼び出すmoveToFirst()と、インデックス 0 (最初の行) に移動します。

于 2012-08-31T12:12:41.157 に答える
1

使用する :

cursor.moveToFirst();

この行のデータを受け取った直後:

Cursor cursor = db.rawQuery(selectQuery, null);
于 2012-08-31T12:10:52.617 に答える