8

我收到此错误

IllegalArgumentException:列“_id”不存在

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

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

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

4

3 回答 3

15

您的数据库不必有一个名为“_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' 列。

于 2011-04-28T21:53:57.217 回答
0

您的表中没有“_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”添加到参数列表的末尾。

于 2011-04-28T21:10:49.467 回答
0

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

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

于 2011-04-28T23:30:24.967 回答