【问题标题】:IllegalArgumentException: column '_id' does not exist when call to SimpleCursorAdaptorIllegalArgumentException:调用 SimpleCursorAdaptor 时列“_id”不存在
【发布时间】:2010-07-13 10:27:54
【问题描述】:

我有一个名为“master”的表,其中包含 idnamesurnamegenderdesignation

当我启动查询以获取 Cursor 对象以获取 CursorAdapter 时,我得到:

IllegalArgumentException: column '_id' does not exist when call to CursorAdaptor 

但我没有名为“_id”的列。

谁能告诉我为什么会出现这个错误?

这是堆栈跟踪:

07-13 15:45:40.582: WARN/System.err(295): java.lang.IllegalArgumentException: column '_id' does not exist
07-13 15:45:40.592: WARN/System.err(295):     at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
07-13 15:45:40.592: WARN/System.err(295):     at android.widget.CursorAdapter.changeCursor(CursorAdapter.java:257)
07-13 15:45:40.602: WARN/System.err(295):     at com.praumtech.names4baby.ui.NamesListAdapter.setCursor(NamesListAdapter.java:63)
07-13 15:45:40.602: WARN/System.err(295):     at com.praumtech.names4baby.ui.BoysNamesListActivity.initNameList(BoysNamesListActivity.java:79)
07-13 15:45:40.602: WARN/System.err(295):     at com.praumtech.names4baby.ui.BoysNamesListActivity.onCreate(BoysNamesListActivity.java:49)
07-13 15:45:40.602: WARN/System.err(295):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
07-13 15:45:40.602: WARN/System.err(295):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
07-13 15:45:40.612: WARN/System.err(295):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
07-13 15:45:40.612: WARN/System.err(295):     at android.app.ActivityThread.access$2100(ActivityThread.java:116)
07-13 15:45:40.612: WARN/System.err(295):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
07-13 15:45:40.612: WARN/System.err(295):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-13 15:45:40.621: WARN/System.err(295):     at android.os.Looper.loop(Looper.java:123)
07-13 15:45:40.621: WARN/System.err(295):     at android.app.ActivityThread.main(ActivityThread.java:4203)
07-13 15:45:40.621: WARN/System.err(295):     at java.lang.reflect.Method.invokeNative(Native Method)
07-13 15:45:40.621: WARN/System.err(295):     at java.lang.reflect.Method.invoke(Method.java:521)
07-13 15:45:40.621: WARN/System.err(295):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
07-13 15:45:40.621: WARN/System.err(295):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
07-13 15:45:40.631: WARN/System.err(295):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android database


    【解决方案1】:

    发生这种情况是因为CursorAdapter 在它使用的表中必须有一个_id 列。

    对于Android应用中的Database(SQLite),最好在所有表中添加一个名为“_id”的列,以便能够使用CursorAdapter

    或者,您可以编写类似的 sql 语句

    select member_id as _id from member _table where ....." 
    

    为了获得可以与CursorAdapter 一起使用的Cursor

    这是在CursorAdaptordocumentation中指定的:

    将数据从 Cursor 公开到 ListView 小部件的适配器。这 光标必须包含名为“_id”的列,否则此类将不起作用。”

    【讨论】:

      【解决方案2】:

      您的namemaster 表需要定义一个列_ID 以供SimpleCursorAdaptor 使用。确保您的表架构包含 _ID 而不是 id,因为后者是错误的。

      【讨论】:

        【解决方案3】:

        简单又咸

        要解决这个问题,您必须将主键字段名称重命名为_id

        【讨论】:

          【解决方案4】:

          我相信 SimpleCursorAdapter 假定存在“_id”列。您需要创建它,这样您可能更容易使用“_id”而不是您自己的“id”。 阅读此page 上的第二篇文章

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-03-22
            • 2017-07-19
            • 2011-03-22
            • 2011-08-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多