我想从一个数据填充的游标中取出一行,并将其存储在另一个对象中以供其他使用。
我代码: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;
}
}