2011-07-21 25 views
6

我有一个在Android 2.1上运行良好的应用程序,但试图将其转换为3.0时,出现游标错误,我不熟悉它。Android 3.0无法从光标窗口读取行#,列#

Java.lang.IllegalStateException:无法读取ROW0,柱-1从 光标窗口。确保光标在 从其访问数据之前正确初始化。

所有的数据都存储在SQLite数据库中,并且此代码在Android 2.1中正常工作。在android 3.0中,游标是否有不同的初始化?

以下是我的代码。

private void OpenGroupData(){ 
SQLiteDatabase db = openOrCreateDatabase(DATABASE_NAME,Context.MODE_PRIVATE,null); 
Cursor cur = db.rawQuery("SELECT groupid FROM properties GROUP BY GroupID" + ";" , null); 
LinearLayout glayout = (LinearLayout) findViewById(R.id.Grouplayout); 
LinearLayout gwindow = (LinearLayout) findViewById(R.id.groupwindow); 

TextView data = new TextView(this); 
glayout.addView(data); 
data.setText(""); 
int ID = cur.getColumnIndex("groupid"); 
int idvalue; 

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER); 

try{ 
    // Check if our result was valid. 
    cur.moveToFirst(); 
    if (cur != null) { 

     // Loop through all Results 
     do {data = new TextView(this); 
      data.setTextSize(20); 
     data.setClickable(true); 
     data.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       GroupClick(v); 
      } 
      }); 
     glayout.addView(data); 
     idvalue = cur.getInt(ID); 
     data.setId(idvalue); 
     data.setText("Group: " + idvalue); 
     }while(cur.moveToNext()); 
     } 
     cur.close(); 
     db.close(); 
     } catch(Exception e) { 
      Toast.makeText(getApplicationContext(), "Open Group Exception: " + e.toString(), Toast.LENGTH_SHORT).show(); 
     } 
} 

回答

1

好吧我想通了。出于某种原因,当我的游标移动并获取字段的列索引时,试图将我的应用程序转换为3.0,在这种情况下(“groupid”),它将返回值-1。当游标尝试从-1开始时,它会崩溃,因为它无法在行(0),列(-1)处找到记录。所以我的解决方法是在获取标识时只添加一个到列索引。见下文。

int ID = cur.getColumnIndex("groupid") + 1; 
int idvalue; 

通过在列索引中加1,它似乎解决了问题。

+0

我有完全相同的问题,并修复它 - 谢谢! +1 – Matt

2

今天早些时候我遇到了同样的错误信息。结果是,我在列名中输入了一个错字。所以,如果它仍然适用,你可以去检查列名错字的。请注意,它的大小写也是。对我来说错误是:

//Trew error 
c.getColumnIndex("ArticleNumber"); 

//Was correct 
c.getColumnIndex("Articlenumber"); 
+1

您可以尝试使用public static final String ARTICLE_NUMBER =“articleNumber”并始终指向该值。所以如果你有一个名为DBConstants的类,你可以这样做:c.getColumnIndex(DBConstants.ARTICLE_NUMBER)。这样你永远不会得到错别字:) – DecodeGnome

1

如果getColumnIndex返回-1,那么该列不存在。 Otherwize它返回从零开始的列索引。

+0

是它的正确。我的列名称是“名称”,但是以getColumnIndex(“Name”)的形式访问。将名称更改为名称后,工作 – Senthil

1

-1是每个sqlite表应该具有android框架所要求的_id列。如果您必须在索引中添加+1,您会在某处出错。

0

如果找不到'columnName',则-1值将返回表单getColumnIndex(columnName)。检查列名

相关问题