如何存储游标中的行

时间:2014-05-15 08:29:18

标签: android sqlite

我想从数据填充的游标中拉出一行并将其存储在另一个对象中供其他用途。

我的代码:

SQLiteDatabase db = dbOpener.getReadableDatabase();
            Cursor dataSet = db.query(WPTemplateDB.PRODUCT_TABLE, 
                                null, //all columns
                                null, //where clause
                                null, //where clause args
                                null, null, null);//groupBy, having, orderBy
while (dataSet.moveToNext()){

                Product product = new Product(dataSet);
                pArray.add(product);
            }

我的存储对象:

public Product(Cursor cursor){

        productData = cursor;
    }

    public String getData(String column){
        Log.d(column, productData.getColumnIndex(column)+"");
        return productData.getString(productData.getColumnIndex(column));
    }

现在,我面临的错误是"索引10请求大小为10"。我能做些什么?

3 个答案:

答案 0 :(得分:2)

不要使用游标是Product个对象的构造函数。它会泄漏内存,因为光标必须在不使用时关闭。 您应该从游标中读取数据,然后将数据发送到构造函数Product,如:

String productName = cursor.getString(0);// 0 is column name
......
cursor.close();

Product product = new Product(name);

答案 1 :(得分:0)

索引从零开始。这意味着大小为10,最大索引为9.从您发布的代码中,一切都很好,所以代码的其他位置出错。

答案 2 :(得分:0)

实际上,这个答案的灵感来自@cuasodayleo,我只是把它翻译成另一个代码。

SQLiteDatabase db = dbOpener.getReadableDatabase();
            Cursor dataSet = db.query(WPTemplateDB.PRODUCT_TABLE, 
                                new String[]{WPTemplateDB.PRODUCT_ID}, 
                                null, //where clause
                                null, //where clause args
                                null, null, null);//groupBy, having, orderBy
            while (dataSet.moveToNext()){

                Product product = new Product(dataSet.getInt(0), db);
                pArray.add(product);
            }
            dataSet.close();

产品对象:

public Product(int pid, SQLiteDatabase db){

        productData = db.query(WPTemplateDB.PRODUCT_TABLE, 
                null, //all columns
                WPTemplateDB.PRODUCT_ID+"=?", //where clause
                new String[]{pid+""}, //where clause args
                null, null, null);//groupBy, having, orderBy    

    }

    public String getData(String column){       
        Log.d("count", productData.getCount()+"");
        if (productData.getCount()>0){
            Log.d(column, productData.getColumnIndex(column)+"");
            productData.moveToFirst();
            return productData.getString(productData.getColumnIndex(column));
        } else {
            return null;
        }       
    }