【问题标题】:Android CursorIndexOutOfBoundException: Index 1 requested, with a size of 1Android CursorIndexOutOfBoundException:请求索引 1,大小为 1
【发布时间】:2014-09-08 01:14:06
【问题描述】:

我不应该得到一个游标索引超出范围异常,我完全按照它应该使用的方式完成了它

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

有趣的是,它在此处的日志中显示了输出

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

我在 Google Android 文档 中阅读了 Cursor 并且我做对了,但我似乎仍然不知道出了什么问题。只有当 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)

任何帮助将不胜感激,我已经问过一次问题但找不到任何答案,如果有人可以提供帮助,请再试一次

【问题讨论】:

  • 试试do{ }while(cursor.moveToNext())
  • 查看我的回答,让我知道这是否适合您。

标签: android android-sqlite android-contentprovider


【解决方案1】:

当大小仅为 1 时,您正尝试访问元素 1(第二个,因为它是从零开始的)。

您检测数据集结尾的方式有问题。 处理完最后一行后,光标不会变为空。 您需要以不同的方式检测数据集的结尾。

你可以使用这个机制:

cursor.moveToFirst();
while (!cursor.isAfterLast()) {
    ....
    cursor.moveToNext();
}

【讨论】:

  • 工作正常,但我不得不将我的 HashMap 向上移动,并且在请求之后我无法访问光标,因为我需要在发送数据后删除该行跨度>
【解决方案2】:

更改这 2 行

cursor.moveToNext();
        } while (cursor.isAfterLast());

While(cursor.hasNext())

并在 do { 指令之后移动 cursor.moveTNext()

【讨论】:

    【解决方案3】:

    改变这个

    if (cursor.moveToFirst()) {
                    do {
                        // some stuff here
                        cursor.moveToNext();
                    } while (cursor.isAfterLast());
                }  
    

    while (cursor.moveToNext()){
      // do the stuff here
    }
    

    cursor.moveToNext() 方法如果 next 存在则返回 true,如果不存在则返回 false。

    【讨论】:

      【解决方案4】:

      cursor.moveToFirst 将您带到第一个(并且仅在这种情况下)结果。下一次调用 cursor.moveToNext 会将您带到不存在的第二个结果(索引 1)。

      所以在检查最后一行时执行以下操作

      while (!cursor.isAfterLast()) {
      
      cursor.moveToNext();
      }
      

      isAfterLast()returns 光标是否指向最后一行之后的位置。因此,通过执行上述操作,您可以确保如果光标未指向最后一行之后的位置,则仅移动到下一行行光标。

      编辑

      从您的代码中删除此 if 语句

      if(cursor.moveToFirst){
      }
      

      而只是使用

      cursor.moveToFirst;
      while (!cursor.isAfterLast()) {
      
      cursor.moveToNext();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-06
        • 2022-01-12
        • 1970-01-01
        • 2018-11-04
        • 2017-12-24
        • 2019-10-26
        • 1970-01-01
        相关资源
        最近更新 更多