我收到此错误
IllegalArgumentException:列'_id'不存在
使用SimpleCursorAdapter
从我的数据库中检索时,该表确实包含此_id
列。注意到这是一个常见问题,我尝试在线解决一些解决方案,但没有一个能够解决。这是我的光标查询:
SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.quoterow, myCursor, new String[]{"_id", "quote"}, new int[]{R.id.quote});
虽然我应该提到原始版本没有包含_id
列,但我最近添加了这个以尝试解决问题。有没有人有任何可能有助于解决问题的想法?
答案 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/