再次出现这个问题,我遇到了Android版sqlite的问题
我目前收到“CursorIndexOutOfBoundsException
:请求的索引1,大小为1”
但是,我有索引-1的这个例外,然后插入了一个cursor.moveToFirst(),
然后我用索引0,然后cursor.moveToNext();
我想用我的代码做什么?我想要一个选定项目的信息(这就是为什么selectionArgs与sQueryid有关。我做错了什么?
Cursor c = a.managedQuery(uri,
projection, //projection
"_ID=?", //selection string
new String[]{sQueryid}, //selection args array of strings
DepotTableMetaData.DEFAULT_SORT_ORDER); //sort order
c.moveToFirst();
c.moveToNext();
int iqrcode = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_QRCODE);
int iname = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_NAME);
int iamount = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_AMOUNT);
int iunit = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_UNIT);
int ippu = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_PPU);
int itotal = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_TOTAL);
int icomment = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_COMMENT);
//Gather values
String id = c.getString(Integer.parseInt(queryid.toString()));
String name = c.getString(iname);
String amount = c.getString(iamount);
String unit = c.getString(iunit);
String ppu = c.getString(ippu);
String total = c.getString(itotal);
String comment = c.getString(icomment);
String qrcode = c.getString(iqrcode);
String[] info = new String[]{id,name,amount,unit,ppu,total,comment,qrcode};
答案 0 :(得分:12)
moveToFirst
会将您带到第一个(也是唯一的)结果。下一次调用moveToNext
会将您带到第二个不存在的结果(索引1)。
尝试删除c.moveToNext();
答案 1 :(得分:1)
移动cursor.moveToFirst();
,你就在那里。由于moveToFirst()
将光标指针带到第一条记录,这就是你需要的。在您执行moveToNext()
之后,请不要像在代码段中那样moveToFirst()
。
答案 2 :(得分:0)
您需要在帖子中包含更多信息;代码显示正在使用的变量,但我们不知道它们是什么(uri,project,sQueryid等)。你有一个sQueryid字符串,并且还试图将一个名为queryid的变量的String值发送到parseInt方法 - 这些变量是否相同,是否有拼写错误?如果没有,你应该尝试替代命名,这样就不那么容易混淆了。
我们也看不出这个代码是什么方法;你提到你在点击ListView时遇到问题,但这是代码所在的位置吗?如果是这样,在Cursor上调用moveToFirst()和/或moveToNext()就不是你想要的了,你不会通过在那里调用managedQuery来获取光标。相反,您需要使用传入方法的位置信息和ListView的适配器。有了更多的代码,我可以举个例子。
如果你只是试图遍历Cursor查询中的所有行,你可能想要做这样的事情:
while (c.moveToNext()) {
String name = c.getString(c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_NAME));
String amount = c.getString(c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_AMOUNT));
// ...
// do something with the data for this row
}
修改(根据评论中列出的代码):
我认为您的问题在于您传递给ShowActivity
家伙的身份证明。在ShowActivity类中,为Cursor
SimpleCursorAdapter
上的ListView
创建一个类级变量,以便您可以使用其他方法访问它。所以,像:
public class ShowActivity extends ListActivity implements OnItemClickListener {
Cursor mCursor;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
mCursor = managedQuery(ContentProviderMetaData.DepotTableMetaData.CONTENT_URI, projection, null, null, ContentProviderMetaData.DepotTableMetaData.DEFAULT_SORT_ORDER);
// ...
SimpleCursorAdapter simpleadapter = new SimpleCursorAdapter(this,R.layout.list_entry, mCursor, columns, to);
// ...
然后,您的onItemClick
方法看起来像这样:
public void onItemClick(AdapterView<?> adapterView, View target, int position, long id) {
Log.d("ShowActivity", "clicked @ " + position);
mCursor.moveToPosition(position);
final String itemId = mCursor.getString(mCursor.getColumnIndex(ContactsContract.Contacts._ID));
Intent openAdvanced = new Intent(ShowActivity.this,AdvancedViewActivity.class);
openAdvanced.putExtra("ID", itemId);
startActivity(openAdvanced);
}
答案 3 :(得分:0)
在我开始编码之后我就停止了这个问题
if (c != null ) {
Cursor c = sql.rawQuery("SELECT...");
c.moveToFirst();
for (int i = 0; i < c.getCount(); i++) {
//do something
c.moveToNext();
}
}