Android CursorIndexOutOfBoundException:请求索引1,大小为1

时间:2014-09-07 15:31:52

标签: android android-sqlite android-contentprovider

当我不应该使用游标时,我会得到一个游标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)

任何帮助都会受到赞赏,我已经问了一次这个问题,找不到任何答案,只要再试一次,如果有人可以提供帮助

4 个答案:

答案 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。