android:游标行计数有问题

时间:2012-08-31 12:06:37

标签: android sqlite cursor

我在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;
    }
}

我只在db中添加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,我对此一无所知:

谢谢

3 个答案:

答案 0 :(得分:3)

您缺少的一行是

cursor.moveToFirst();

代码中的内容:

Cursor cursor = db.rawQuery(selectQuery, null);
int n = cursor.getCount();
cursor.moveToFirst();
int n = cursor.getCount();
String s = cursor.getString(0);

答案 1 :(得分:2)

您需要添加if条件:

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

为什么呢? Cursors (initially) begin at row index -1(在第一行之前)。因此,调用moveToFirst()会将您移至索引0(第一行)。

答案 2 :(得分:1)

使用:

cursor.moveToFirst();

在收到此行中的数据后立即:

Cursor cursor = db.rawQuery(selectQuery, null);