Java 列“\u id”主键SimpleCursorAdapter

Java 列“\u id”主键SimpleCursorAdapter,java,android,sqlite,Java,Android,Sqlite,作为项目的一部分,我正在制作一款android应用程序,用于跟踪用户在健身房的锻炼情况。通过各种设置、重量和重复的训练和练习 我希望用户命名他们的训练,然后将其添加到“训练”活动中,当他们添加训练时,该活动将填充到列表视图中。然后,我计划添加一个“完成”按钮,并使用“选择练习”保存训练。因为这将是一对多的关系 下面的代码是我拥有的数据库助手以及查看训练和练习的活动。但是SimpleCrsorAdapter给我带来了问题 正在绕圈试图修复这个bug,有人能帮我修复吗?这个_id在主键中,所以我不知

作为项目的一部分,我正在制作一款android应用程序,用于跟踪用户在健身房的锻炼情况。通过各种设置、重量和重复的训练和练习

我希望用户命名他们的训练,然后将其添加到“训练”活动中,当他们添加训练时,该活动将填充到列表视图中。然后,我计划添加一个“完成”按钮,并使用“选择练习”保存训练。因为这将是一对多的关系

下面的代码是我拥有的数据库助手以及查看训练和练习的活动。但是SimpleCrsorAdapter给我带来了问题

正在绕圈试图修复这个bug,有人能帮我修复吗?这个_id在主键中,所以我不知道出了什么问题。之前,我在那里也有自动增量,但它也给出了一个错误

日志类别如下所示:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.cormac.gym12m/com.example.cormac.gym12m.ViewWorkoutsActivity}: java.lang.IllegalArgumentException: column '_id' does not exist
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                  at android.app.ActivityThread.access$900(ActivityThread.java:150)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:148)
                  at android.app.ActivityThread.main(ActivityThread.java:5417)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
               Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
                  at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:333)
                  at android.widget.CursorAdapter.init(CursorAdapter.java:180)
                  at android.widget.CursorAdapter.<init>(CursorAdapter.java:157)
                  at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:96)
                  at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:104)
                  at com.example.cormac.gym12m.ViewWorkoutsActivity.onCreate(ViewWorkoutsActivity.java:42)
                  at android.app.Activity.performCreate(Activity.java:6294)
                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                  at android.app.ActivityThread.access$900(ActivityThread.java:150) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                  at android.os.Looper.loop(Looper.java:148) 
                  at android.app.ActivityThread.main(ActivityThread.java:5417) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
 I/Process: Sending signal. PID: 16275 SIG: 9
  Application terminated.
}

查看训练活动

public class ViewWorkoutsActivity extends AppCompatActivity{

ListView workoutlist;
ListView exerciselist;

Cursor workoutsCursor;
Cursor exercisesCursor;

SimpleCursorAdapter sca_workEx;
SimpleCursorAdapter sca_workouts;


DBHelper dbh = new DBHelper(this);


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_workouts);

    workoutlist = (ListView) findViewById(R.id.workoutlist);
    exerciselist = (ListView) findViewById(R.id.exerciselist);

    exercisesCursor = dbh.getWorkoutExercises(-1);
    workoutsCursor = dbh.getWorkouts();

    sca_workEx  = new SimpleCursorAdapter(this,
            android.R.layout.simple_list_item_1,
            exercisesCursor,
            new String[]{DBHelper.WORKOUT_NAME},
            new int[]{android.R.id.text1},0);

    sca_workouts = new SimpleCursorAdapter(this,
            android.R.layout.simple_list_item_1,
            workoutsCursor,
            new String[]{DBHelper.WORKOUT_NAME},
            new int[]{android.R.id.text1},0);


    workoutlist.setAdapter(sca_workouts);


    workoutlist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            exercisesCursor = dbh.getAllWorkoutsExercises(1);
            sca_workouts.swapCursor(exercisesCursor);

        }
    });

}
}

此表没有名为_id的列。它有一个名为exercise\u id的列,数据类型为_idinteger主键。

游标适配器,如您所使用的游标适配器类的子类SimpleCursorAdapter,需要名为_id的列。它使用此字段为onItemClick等方法提供id

游标必须包含名为_id的列,否则此类将不会 工作

摘自

这就是您得到的错误的原因

有两种可能的修复方法

第一种方法是使用_id作为exercise_id列名

e、 g.编码公共静态最终字符串练习\u ID=\u ID

这将需要删除表,如果丢失当前数据不是问题,可能最简单的方法是删除应用程序的数据或卸载应用程序,然后使用上述更改重新运行。另一种选择是进行更改,然后增加数据库版本,例如私有静态最终int-Database_version=2;重新运行应用程序将调用DBHelper的onUpgrade方法,删除表并调用onCreate方法

第二种方法是在游标中提供_id列作为派生列

您可以通过以下方式更改GetWorkoutExcesses方法来实现这一点:-

public Cursor getWorkoutExercises(long exerciseid){
    String[] columns = new String[]{EXERCISE_ID + " AS _id","*"}
    return this.getWritableDatabase().query(TABLE_EXERCISE, columns,
            EXERCISE_ID+"=?",
            new String[]{Long.toString(exerciseid)},
            null,null,null);

}
列也可以是以下列之一 String columns=新字符串[]{*,练习_ID+AS _ID} String columns=新字符串[]{*,rowid为_id} String columns=新字符串[]{rowid AS _id,*}
我建议改名列名是更好的方法。

@user303749如果这回答了您的问题,请勾选此作为答案。我有我的代表低于15,因此它尚未铸造,当我的代表被铸造时将再次进行up@user303749你可以在回答的问题上打勾,不管你的名声如何,这是向上投票,你不能做你不能做的向上箭头。
public static final String EXERCISE_ID = "exercise_id";
        ...
        + EXERCISE_ID + " _id INTEGER PRIMARY KEY, "
public Cursor getWorkoutExercises(long exerciseid){
    String[] columns = new String[]{EXERCISE_ID + " AS _id","*"}
    return this.getWritableDatabase().query(TABLE_EXERCISE, columns,
            EXERCISE_ID+"=?",
            new String[]{Long.toString(exerciseid)},
            null,null,null);

}