什么这个例外非法论证意味着什么?

时间:2017-10-17 07:35:45

标签: android

     E/AndroidRuntime: FATAL EXCEPTION: main

     Process: com.example.bestbuy.mytry, PID: 32644
                                                                       java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bestbuy.mytry/com.example.bestbuy.mytry.DisplayActivity}: java.lang.IllegalArgumentException: column '_id' does not exist
                                                                           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
                                                                           at android.app.ActivityThread.access$800(ActivityThread.java:151)
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                           at android.os.Looper.loop(Looper.java:135)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:5254)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at java.lang.reflect.Method.invoke(Method.java:372)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697)
                                                                        Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
                                                                           at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
                                                                           at android.widget.CursorAdapter.init(CursorAdapter.java:172)
                                                                           at android.widget.CursorAdapter.<init>(CursorAdapter.java:149)
                                                                           at com.example.bestbuy.mytry.CustomAdapter.<init>(CustomAdapter.java:19)
                                                                           at com.example.bestbuy.mytry.DisplayActivity.onCreate(DisplayActivity.java:18)
                                                                           at android.app.Activity.performCreate(Activity.java:6033)
                                                                           at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                                                                           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
                                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                                                                           at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                           at android.os.Looper.loop(Looper.java:135) 
                                                                           at android.app.ActivityThread.main(ActivityThread.java:5254) 
                                                                           at java.lang.reflect.Method.invoke(Native Method) 
                                                                           at java.lang.reflect.Method.invoke(Method.java:372) 

当我从sqlitedatabase检索数据并在ListView中显示它时,会出现此异常。我无法解释这一点。请帮助理解它以及这在我的应用程序的上下文中意味着什么。如果您想要更多数据,请告诉我。谢谢

这是我的sqlitedatabase代码 -

    public class DatabaseHelper extends SQLiteOpenHelper {
     public static final String DATABASE_NAME="AppDB";
     public static final int DATABASE_VERSION=1;
     public static final String TABLE_NAME="Users";
     public static final String Column1="id";
     public static final String Column2="task";
     public static final String Column3="ddate";
     public static final String Query="CREATE TABLE "+TABLE_NAME+"("+Column1+" INTEGER PRIMARY KEY AUTOINCREMENT,"+Column2+" TEXT NOT NULL,"+Column3+" TEXT NOT NULL)";
public DatabaseHelper(Context context) {

    super(context,DATABASE_NAME,null,DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(Query);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
public boolean insertValues(String task,String datee) {
    SQLiteDatabase db=this.getWritableDatabase();
    ContentValues values=new ContentValues();
    values.put(Column2,task);
    values.put(Column3,datee);
    long rows=db.insertOrThrow(TABLE_NAME,null,values);
    if(rows>0){
        return true;
    }
    else
        return false;
}
 public Cursor retrieveValues() {
    SQLiteDatabase db=this.getWritableDatabase();
    Cursor cursor=db.rawQuery("SELECT * FROM Users",null);
    return cursor;
}

这是我的customAdapter代码:

     public class CustomAdapter extends CursorAdapter {
     TextView task,daate;
     public CustomAdapter(Context context, Cursor cursor) {
    super(context, cursor, 0);
     }

// The newView method is used to inflate a new view and return it,
// you don't bind any data to the view at this point.
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return LayoutInflater.from(context).inflate(R.layout.adapter, parent, false);
}

// The bindView method is used to bind all data to a given view
// such as setting the text on a TextView.
@Override
public void bindView(View view, Context context, Cursor cursor) {
    // Find fields to populate in inflated template
    task=(TextView)view.findViewById(R.id.dynamicTask);
    daate=(TextView)view.findViewById(R.id.dynamicDate);
    String Task=cursor.getString(cursor.getColumnIndex("task"));
    String Daate=cursor.getString(cursor.getColumnIndex("ddate"));
    task.setText(Task);
    daate.setText(Daate);
}

}

这是我的DisplayActivity代码:

 public class DisplayActivity extends AppCompatActivity {
  ListView tasklist;
  DatabaseHelper db;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_show);
    tasklist=(ListView)findViewById(R.id.taskList);
    db=new DatabaseHelper(this);
    Cursor cursor=db.retrieveValues();
    CustomAdapter todoadapter=new CustomAdapter(this,cursor);
    tasklist.setAdapter(todoadapter);
}

}

1 个答案:

答案 0 :(得分:0)

要使用CursorAdapter课程,database必须有_id列作为官方文档states

  

将数据从Cursor公开给ListView小部件的适配器。

     

Cursor必须包含名为“_ id”的列,否则此类不会   工作。此外,如果使用MergeCursor与此类不起作用   合并后的游标在“_ id”列中具有重叠值。

因此,请在表格创建脚本中将id列替换为_id,以符合使用CursorAdapter类的要求。