【问题标题】:Android-sqlite Couldn't read row 0, col -1 from Cursor WindowAndroid-sqlite 无法从光标窗口读取第 0 行,列 -1
【发布时间】:2016-03-12 01:16:51
【问题描述】:

我正在尝试从表中获取值。

 cursor=db.rawQuery("select value from '" + tableName + "' where key= '" + name + "' ",null);

if (cursor.getCount()>0){
        if (cursor.moveToFirst()){
                String value= cursor.getString(cursor.getColumnIndex("value"));
                return value;
        }
        cursor.close();

    }

我得到了例外:

Couldn't read row 0, col -1 from Cursor Window.Make sure cursor is initialised correctly before accessing data from it.

当我使用时:

        cursor.getString(0);

我能够得到我需要的价值。

如果我使用,

       cursor.getString(cursor.getColumnIndex("value"));

我得到了例外。

这是我的桌子的快照:

【问题讨论】:

  • 你的变量 tableName 为空。
  • sry....我发布了错误的错误...我更新了问题@GabeSechan
  • 是命名值还是值? SQL 对表名和列名区分大小写,即使它不用于关键字。
  • 总而言之-不要使用字符串追加查询这样的值。将变量附加到 SQL 文本是要求 SQL 注入错误。请改用绑定变量。
  • 然后getColumnIndex("VALUE");

标签: android sqlite android-cursor


【解决方案1】:

SQL 中的表名和列名区分大小写。由于您的列名为“VALUE”,因此您需要 getColumnIndex("VALUE")

【讨论】:

  • 顺便说一句,如果你不打算检查返回值,你不妨使用getColumnIndexOrThrow() 方法——如果/当它失败时,它会给你更多有用的错误消息。
  • 不管怎样,SQL 中的名称区分大小写,但在Cursor API 中它们是。
  • 它的具体实现。有些数据库区分大小写,有些则不。 SQLite 是。在编写通用 SQL 代码时假设它更安全。
【解决方案2】:

您创建的表必须有一个名为 _id 的列。在添加列索引为“_id”的列之前,它不会起作用。

如果您没有任何列索引为“_id”的列。从设置-> 应用程序管理器中显式卸载您的应用程序。添加所需的列后重新运行您的应用程序。

【讨论】:

  • SQLite 自动添加 id 列。这也不是必需的,您可以创建一个没有表的表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多