【问题标题】:Android: column '_id' does not existAndroid:列“_id”不存在
【发布时间】:2011-08-15 01:33:30
【问题描述】:

我收到了这个错误

IllegalArgumentException:列“_id”不存在

当使用SimpleCursorAdapter 从我的数据库中检索时,该表确实有这个_id 列。注意到这是一个常见问题,我尝试通过一些在线解决方案来解决它,但它们都不起作用。这是我的光标查询:

SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.quoterow, myCursor, new String[]{"_id", "quote"}, new int[]{R.id.quote});

虽然我应该提到原来没有包含_id 列,但我最近添加了这个以尝试解决问题。有没有人有任何可能有助于解决问题的想法?

【问题讨论】:

    标签: android sqlite android-sqlite android-cursoradapter


    【解决方案1】:

    您的数据库不必有一个名为“_id”的列,但 SimpleCursorAdaptor 确实需要返回一个。您可以使用别名来执行此操作。

    一个例子是我有一个带有列的表...

    uid,name,number
    

    要查询 SimpleCursorAdapter,我使用数据库 rawQuery...

    SELECT uid as _id,name,number FROM MY_TABLE
    

    这可以正常工作并为 SimpleCursorAdapter 提供必要的“_id”列。

    编辑:据我了解,_id 字段用作唯一键,以确保适配器和适配器视图等可以正确处理光标处理的数据。

    查看文档中Content Providers 的数据模型。

    在任何类型的“数据库”中使用唯一键是非常普遍的做法,据我所知,使用列名“_id”(或“_ID”)只是一种标准化和简化数据库、内容提供者、游标、适配器等方面的工作

    简而言之,为了使这些不同的组件正常工作,它们需要一个具有唯一值的数据列,但它们还必须“知道”该列的名称是什么。他们不会“知道”,可以这么说,我的列名 'uid' 是他们需要的,而不是我的 'name' 和 'number' 列。

    【讨论】:

    • 您好 MisterSquonk,我已将代码更改为 rawQuery,并且不再收到列 _id 错误消息。您能否解释一下为什么光标适配器需要解释这个 _id,因为我无法理解它。
    • @MindDrip:请参阅我的回答中的编辑。
    • 只是我使用别名重命名了我的 task_id 列,问题就解决了!!! task_id 作为_id
    【解决方案2】:

    您的表中没有“_id”列,或者您的查询中没有包含它。这就是导致异常的原因。您还需要修复以下问题:

    CursorAdapter 构造函数的最后一个参数缺少 _id 的 to 列引用。

    int[] 参数是一个视图 ID 数组,用于填充来自光标的值。 String[] 参数是光标指向的行中的列名数组。

    您必须在 from 数组中拥有与 to 数组相同数量的值。因为来自游标的数据是从游标中抓取并放置到视图中的。如果每个数组中的值数量不同,适配器会抛出异常,因为它没有足够的信息将数据映射到视图。

    此外,根据 SimpleCursorAdapter 的 JavaDoc,该构造函数已被弃用,因为它会导致在 UI 线程中执行查询。哪个不好。改用这个:

    http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html#SimpleCursorAdapter%28android.content.Context,%20int,%20android.database.Cursor,%20java.lang.String[], %20int[],%20int%29

    一个简单的解决方法是将“,0”添加到参数列表的末尾。

    【讨论】:

    • 嗨,Adam,您能详细解释一下吗,游标适配器中的最后一个参数是 to,为什么需要引用 _id?
    • 我曾尝试使用您建议的光标,但奇怪的是它最后不会接受 int,所以我无法尝试您的建议。
    • 酷,虽然我对 android 还很陌生,但我了解游标的概念,而且我的代码确实与数据库列和视图具有正确的 from 和 to 相关性,所以我没有认为这是问题所在。但感谢您的建议。
    • 我正在查看您发布的代码示例:new String[]{"_id", "quote"}, new int[]{R.id.quote},您有两个“来自”和一个“到”。但是,是的,我只是重读了您的例外,这是关于其他事情的。我将其添加到答案的顶部
    • 好吧,可能值得指出的是,我有两个都包含 _id 的表,尽管变量名称是 KEY_ROWID 和 KEY_ROWIDb,但我不确定这会是一个问题吗?
    【解决方案3】:

    如果您尝试在 Android 应用程序中使用现有的 sqlite 数据库,那么您需要做一些准备工作以使其正常工作。这篇博文详细描述了这个过程。

    http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

    【讨论】:

      猜你喜欢
      • 2011-03-22
      • 2016-06-30
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多