【问题标题】:Android SQLite java.lang.IllegalArgumentException: column '_id' does not existAndroid SQLite java.lang.IllegalArgumentException:列'_id'不存在
【发布时间】:2016-06-30 00:38:44
【问题描述】:

这是我创建表格的方式...

"CREATE TABLE IF NOT EXISTS Product (
    _ID INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE , 
    Name VARCHAR NOT NULL, 
    Code VARCHAR NOT NULL, 
    Quantity VARCHAR NOT NULL, 
    PRICE DOUBLE NOT NULL );"

如果我这样做。

myDb = new DbAdapter(getApplicationContext());
        Cursor res = myDb.getData(tbs.productsTable, tbs.getProductsColumns(), " ");    
        toast(res.getColumnName(0));

然后它显示_ID,但是当我这样做时:

ListView lvItems = (ListView) findViewById(R.id.listViewProduct);
        Populate_Products todoAdapter = new Populate_Products(this, res);
        lvItems.setAdapter(todoAdapter);

它给了我这个错误:

03-14 19:36:52.459 31990-31990/com.example.danyalahmed.stockmanagement E/AndroidRuntime: 致命异常: main 进程:com.example.danyalahmed.stockmanagement,PID:31990 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.danyalahmed.stockmanagement/com.example.danyalahmed.stockmanagement.Activities.ListProducts}: java.lang.IllegalArgumentException:列“_id”不存在 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442) 在 android.app.ActivityThread.access$800(ActivityThread.java:156) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:211) 在 android.app.ActivityThread.main(ActivityThread.java:5373) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 引起:java.lang.IllegalArgumentException:列'_id'没有 存在 在 android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303) 在 android.widget.CursorAdapter.init(CursorAdapter.java:172) 在 android.widget.CursorAdapter.(CursorAdapter.java:149) 在 com.example.danyalahmed.stockmanagement.Classes.Populate_Products.(Populate_Products.java:20) 在 com.example.danyalahmed.stockmanagement.Activities.ListProducts.loadData(ListProducts.java:52) 在 com.example.danyalahmed.stockmanagement.Activities.ListProducts.onCreate(ListProducts.java:37) 在 android.app.Activity.performCreate(Activity.java:5990) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442) 在 android.app.ActivityThread.access$800(ActivityThread.java:156) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:211) 在 android.app.ActivityThread.main(ActivityThread.java:5373) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)

【问题讨论】:

    标签: java android sqlite


    【解决方案1】:

    Cursor 列名区分大小写,CursorAdapter 期望看到小写的_id。 (SQL 标识符本身不区分大小写。)

    要么重命名列并重新创建表,要么直接以小写形式显式选择它,例如SELECT _id, ....

    【讨论】:

      【解决方案2】:

      CREATE 语句中尝试 _id 而不是 _ID -

      "CREATE TABLE IF NOT EXISTS Product (
      _id INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE , 
      Name VARCHAR NOT NULL, 
      Code VARCHAR NOT NULL, 
      Quantity VARCHAR NOT NULL, 
      PRICE DOUBLE NOT NULL );"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-22
        • 2011-08-15
        • 1970-01-01
        相关资源
        最近更新 更多