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);
}
}
答案 0 :(得分:0)
要使用CursorAdapter
课程,database
必须有_id
列作为官方文档states:
将数据从Cursor公开给ListView小部件的适配器。
Cursor必须包含名为“_ id”的列,否则此类不会 工作。此外,如果使用MergeCursor与此类不起作用 合并后的游标在“_ id”列中具有重叠值。
因此,请在表格创建脚本中将id
列替换为_id
,以符合使用CursorAdapter
类的要求。