2012-04-19 56 views
0

我创建了一个数据库,我想通过使用光标从数据库中检索某些数据由我总是得到这个错误光标异常

04-19 20:02:56.747: E/AndroidRuntime(301): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1 
04-19 20:02:56.747: E/AndroidRuntime(301): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580) 
04-19 20:02:56.747: E/AndroidRuntime(301): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214) 
04-19 20:02:56.747: E/AndroidRuntime(301): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41) 

这里是函数的代码

public double getlatitude(String[] i,int x) { 
     // TODO Auto-generated method stub 
     String[] columns = new String[] { KEY_SQUAREID, KEY_SQUARELATITUDE, KEY_SQUARENAME, 
       KEY_SQUARELONGITUDE 
       }; 

    Cursor c; 
     c=ourDatabase.query("squares", columns,"squarename=?",i, null, null, null); 

     String latitude = null; 
     if (c.moveToFirst()) { 
      latitude=c.getString(0); 
     } 

     double latitude_double=Double.parseDouble(latitude); 
     return latitude_double; 
    } 

回答

1

试试这个

if(c.getCount() > 0) { 
    c.moveToFirst(); 
    for(int i=0;i<c.getCount();i++) { 
    //do your logic here 
    } 
} 
+0

它给了我同样的错误 – 2012-04-19 18:23:09

+0

@KhaledMohamed尝试光标的打印数量进行记录,Log.d(TAG,将String.valueOf(c.getCount())之前if语句 – 2012-04-19 18:31:48

+0

我搞清楚你是right感谢您的帮助 – 2012-04-19 23:43:00

0

我认为这个问题是在这里:

latitude=c.getString(0); 

将其更改为:

latitude = c.getString(c.getColumnIndex("column_name")); 

,也不要忘记通过调用c.close();

0

例外返回值之前关闭游标可能发生,因为你的光标是空的(有可能是没有比赛)。为了避免这种情况,请确保您检查游标是否为空,如果游标为空,则不应尝试访问游标。如果它不为空,则应检查最大行数,并确保不访问任何等于或高于最大行数的行。请参见下面的代码:

if (c != null && c.getCount() > 0) { 
    if (c.moveToFirst()) { 
     do { 

      // do something here 

     } while (c.moveToNext()); 
    } 
    c.close(); 
} 
0

当你正在处理光标,经常检查空和无故障检查moveToFirst(),如果你想避免在未来怪异崩溃。

if(c != null){ 
    if(c.moveToFirst()){ 
     //Do your stuff 
    } 
} 

//After finishing always close the cursor. 
c.close();