【问题标题】:Android 3.0 Couldn't read row#, column# from cursor windowAndroid 3.0 无法从光标窗口读取行#、列#
【发布时间】:2022-01-05 03:50:39
【问题描述】:

我有一个在 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();
        }
 }

【问题讨论】:

    标签: android window android-cursor android-3.0-honeycomb


    【解决方案1】:

    我今天早些时候遇到了同样的错误消息。结果是我在列名中打错了字。所以,如果它仍然适用,你可以去检查列名是否有错别字。请注意,它也区分大小写。我的错误是:

    //Trew error
    c.getColumnIndex("ArticleNumber");
    
    //Was correct
    c.getColumnIndex("Articlenumber");
    

    【讨论】:

    • 您可以尝试使用 public static final String ARTICLE_NUMBER = "articleNumber" 并始终指向该值。因此,如果您有一个名为 DBConstants 的类,您可以执行以下操作:c.getColumnIndex(DBConstants.ARTICLE_NUMBER)。这样你就永远不会有错别字:)
    【解决方案2】:

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

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

    通过将 1 添加到 Column 索引似乎已经解决了问题。

    【讨论】:

    • 我遇到了完全相同的问题,这解决了它——谢谢! +1
    【解决方案3】:

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

    【讨论】:

    • 是的,它是正确的。我的列名是“name”,但作为 getColumnIndex("Name") 访问。将 Name 更改为 name 后,工作
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      如果找不到'columnName',则-1 值从getColumnIndex(columnName) 形式返回。检查列名

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-14
        相关资源
        最近更新 更多