Android:列'_id'不存在

时间:2011-04-28 21:05:41

标签: android sqlite android-sqlite android-cursoradapter

我收到此错误

  

IllegalArgumentException:列'_id'不存在

使用SimpleCursorAdapter从我的数据库中检索时,该表确实包含此_id列。注意到这是一个常见问题,我尝试在线解决一些解决方案,但没有一个能够解决。这是我的光标查询:

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

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

3 个答案:

答案 0 :(得分: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'是他们需要的名称而不是我的'名字'和'数字'列。

答案 1 :(得分:0)

您的表格中没有“_id”列,或者您的查询中未包含该列。这就是引起异常的原因。您还需要修复以下内容:

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

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

在执行to数组时,from数组中必须有相同数量的值。因为来自Cursor的数据正从Cursor中获取并放置到视图中。如果每个数组中没有相同数量的值,则适配器会抛出异常,因为它没有足够的信息来将数据映射到视图。

此外,根据JavaDoc for SimpleCursorAdapter,不推荐使用该构造函数,因为它会导致在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”。

答案 2 :(得分:0)

如果您尝试在Android应用程序中使用现有的sqlite数据库,那么您需要做一些准备工作才能使其正常工作。本博文详细介绍了该过程。

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