Window 安卓3.0无法';t从光标窗口读取行#,列#

Window 安卓3.0无法';t从光标窗口读取行#,列#,window,cursor,android-3.0-honeycomb,Window,Cursor,Android 3.0 Honeycomb,我有一个在安卓2.1上运行良好的应用程序,但当我尝试将其转换到3.0时,我遇到了一个我不熟悉的游标错误 Java.lang.IllegalStateException:无法从中读取第0行第1列 光标窗口。在开始之前,请确保光标已正确初始化 从中访问数据 所有数据都存储在SQLite数据库中,该代码在Android2.1中运行良好。在android 3.0中,光标的初始化是否必须不同 下面列出的是我的代码 private void OpenGroupData(){ SQLiteDatabase d

我有一个在安卓2.1上运行良好的应用程序,但当我尝试将其转换到3.0时,我遇到了一个我不熟悉的游标错误

Java.lang.IllegalStateException:无法从中读取第0行第1列 光标窗口。在开始之前,请确保光标已正确初始化 从中访问数据

所有数据都存储在SQLite数据库中,该代码在Android2.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();
        }
 }

好吧,我知道了。由于某种原因,当光标移动并获取字段的列索引时,尝试将应用程序转换到3.0时,在本例中(“groupid”),它返回的值为-1。当光标试图从-1开始时,它会崩溃,因为它在第(0)行第(-1)列中找不到记录。因此,我的解决方案是在获取id时只向列索引中添加一个。请参见下文

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

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

今天早些时候,我遇到了相同的错误消息。结果是我在列名上打了个错字。因此,如果它仍然适用,您可以去检查列名是否有拼写错误。请注意,它也区分大小写。我的错误大致如下:

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

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

如果getColumnIndex返回-1,则该列不存在。
否则它将返回基于零的列索引。

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

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

您可以尝试使用公共静态最终字符串ARTICLE\u NUMBER=“articlernumber”并始终指向该值。因此,如果您在一个名为DBConstants的类中有一个,那么您可以执行如下操作:c.getColumnIndex(DBConstants.ARTICLE_NUMBER)。这样你就永远不会有打字错误:)是的,这是正确的。我的列名是“name”,但作为getColumnIndex(“name”)访问。在将名称更改为名称后,workedI遇到了完全相同的问题,这就解决了它--谢谢+1.