Android 3.0 无法从游标窗口读取第(row#)行,第(column#)列。

6
我有一个应用程序在Android 2.1上运行良好,但是当我尝试将其转换到3.0时,出现了一个我不熟悉的游标错误。
Java.lang.IllegalStateException: 无法从游标窗口读取行0,列-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();
        }
 }
5个回答

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

好的,我解决了。不知道为什么,在尝试将我的应用程序转换到3.0时,当光标获取字段的列索引时,例如("groupid"),它返回一个值为-1。当光标尝试从-1开始时,它会崩溃,因为它找不到行(0),列(-1)的记录。所以我的解决方法就是在获取id时将列索引加一。请参见下面。

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

通过将列索引加1,似乎已经解决了问题。


1

-1жҳҜ_idеҲ—пјҢжҜҸдёӘSQLiteиЎЁйғҪеә”иҜҘжңүпјҢеӣ дёәиҝҷжҳҜAndroidжЎҶжһ¶жүҖиҰҒжұӮзҡ„гҖӮеҰӮжһңжӮЁеҝ…йЎ»е°Ҷзҙўеј•еҠ 1пјҢеҲҷиҜҙжҳҺжӮЁеҒҡй”ҷдәҶд»Җд№ҲгҖӮ


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

是的,正确的。我的列名是“name”,但被访问时却使用了getColumnIndex(“Name”)。将“Name”更改为“name”后,就起作用了。 - Senthil

0
如果无法找到“columnName”,则getColumnIndex(columnName)返回-1值。请检查列名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接