当我不应该使用游标时,我会得到一个游标Index Out Of Bound异常,我确切地知道应该如何使用
if(cursor.moveToFirst)
我的代码如下所示
Log.w("colum3", String.valueOf(cursor.getCount()));
if (cursor.moveToFirst()) {
do {
//final Uri id = Uri.parse(cursor.getString(cursor.getColumnIndex("_id")));
//Log.d("PRINT3:", id.toString());
String link = cursor.getString(cursor.getColumnIndex("token_id"));
String URL_Update = "http://xxxxxxxxxxxxxxxx/add.json?token=" + link;
Log.d("Sync Url3:", URL_Update);
StringRequest req = new StringRequest(Request.Method.POST ,URL_Update,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// TODO Auto-generated method stub
try {
provider.delete(uri, cursor.getString(cursor.getColumnIndex("_id")), null);
getContext().getContentResolver().notifyChange(uri, null);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.e("str Response3:", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
}
}){
@Override
protected Map<String,String> getParams(){
Map<String,String> params = new HashMap<String, String>();
params.put("device_id",cursor.getString(cursor.getColumnIndex("device_id")));
params.put("latitude",cursor.getString(cursor.getColumnIndex("lat")));
params.put("longitude", cursor.getString(cursor.getColumnIndex("long")));
params.put("time", cursor.getString(cursor.getColumnIndex("time")));
Log.d("Parameter3", params.toString());
return params;
}
};
AppController.getInstance().addToRequestQueue(req);
cursor.moveToNext();
} while (cursor.isAfterLast());
}
有趣的是,它显示了Log log
中的输出final Uri id = Uri.parse(cursor.getString(cursor.getColumnIndex("_id")));
Log.d("PRINT3:", id.toString());
String link = cursor.getString(cursor.getColumnIndex("token_id"));
String URL_Update = "http://xxxxxxxxxxxxxxxx/add.json?token=" + link;
Log.d("Sync Url3:", URL_Update);
我在谷歌Android文档中阅读光标,我做得对,但我似乎仍然不知道出现了什么问题。只有在Sqlite数据库中只有一个数据时才会发生。
我的日志在
之下09-05 20:52:37.245: E/AndroidRuntime(5152): FATAL EXCEPTION: SyncAdapterThread-1
09-05 20:52:37.245: E/AndroidRuntime(5152): Process: com.deliveryscience.track:sync, PID: 5152
09-05 20:52:37.245: E/AndroidRuntime(5152): android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
09-05 20:52:37.245: E/AndroidRuntime(5152): at android.database.AbstractCursor.checkPosition(AbstractCursor.java)
09-05 20:52:37.245: E/AndroidRuntime(5152): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java)
09-05 20:52:37.245: E/AndroidRuntime(5152): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java)
09-05 20:52:37.245: E/AndroidRuntime(5152): at com.deliveryscience.track.services.SyncAdapter.sendData(SyncAdapter.java:224)
09-05 20:52:37.245: E/AndroidRuntime(5152): at com.deliveryscience.track.services.SyncAdapter.onPerformSync(SyncAdapter.java:51)
09-05 20:52:37.245: E/AndroidRuntime(5152): at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java)
09-05 20:52:37.526: E/Volley(5152): [80521] NetworkDispatcher.run: Unhandled exception android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
09-05 20:52:37.526: E/Volley(5152): android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
09-05 20:52:37.526: E/Volley(5152): at android.database.AbstractCursor.checkPosition(AbstractCursor.java)
09-05 20:52:37.526: E/Volley(5152): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java)
09-05 20:52:37.526: E/Volley(5152): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java)
09-05 20:52:37.526: E/Volley(5152): at com.deliveryscience.track.services.SyncAdapter$9.getParams(SyncAdapter.java:257)
09-05 20:52:37.526: E/Volley(5152): at com.android.volley.Request.getBody(Request.java:433)
09-05 20:52:37.526: E/Volley(5152): at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:236)
09-05 20:52:37.526: E/Volley(5152): at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:210)
09-05 20:52:37.526: E/Volley(5152): at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:106)
09-05 20:52:37.526: E/Volley(5152): at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:93)
09-05 20:52:37.526: E/Volley(5152): at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:110)
任何帮助都会受到赞赏,我已经问了一次这个问题,找不到任何答案,只要再试一次,如果有人可以提供帮助
答案 0 :(得分:0)
cursor.moveToFirst
会将您带到第一个(仅在此情况下)结果。下一次调用cursor.moveToNext
会将您带到第二个不存在的结果(索引1)。
在检查最后一行时,请执行以下操作
while (!cursor.isAfterLast()) {
cursor.moveToNext();
}
isAfterLast()
返回光标是否指向最后一行之后的位置。如上所述,您确保如果光标未指向最后一行之后的位置,则仅移动到下一行光标。
修改强>
从代码中删除此if
语句
if(cursor.moveToFirst){
}
而只是使用
cursor.moveToFirst;
while (!cursor.isAfterLast()) {
cursor.moveToNext();
}
答案 1 :(得分:0)
更改此2行
cursor.moveToNext();
} while (cursor.isAfterLast());
使用
While(cursor.hasNext())
在do {instruction
之后移动cursor.moveTNext()
答案 2 :(得分:0)
当大小只有一个时,你正试图访问元素1(第二个,因为它从零开始)。
您检测数据集结束的方式存在问题。 在您处理完最后一行后,您的光标不会变为空。 您需要以不同的方式检测数据集的结尾。
您可以使用此机制:
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
....
cursor.moveToNext();
}
答案 3 :(得分:0)
更改此
if (cursor.moveToFirst()) {
do {
// some stuff here
cursor.moveToNext();
} while (cursor.isAfterLast());
}
到
while (cursor.moveToNext()){
// do the stuff here
}
如果next存在,cursor.moveToNext()方法将返回true,如果不存在则返回false。