如何存储游标中的一行



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

我代码:

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);
            }

my storage object:

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"。我能做些什么呢?

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

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

索引从零开始。这意味着它的大小是10,最大索引是9。从你发布的代码来看,一切都很好,所以错误出现在你代码的其他地方。

实际上,这个答案是受@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();

Product对象:

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

最新更新