-2

作为项目的一部分,我正在制作跟踪用户在健身房锻炼的安卓应用程序。通过各种设置、重量和次数的锻炼和练习。这将与作为外键的锻炼 ID 建立 1:M 关系。我还是 android 和 sqlite 的新手,所以我只是想在继续之前检查下面的代码是否正确。

任何建议将不胜感激

数据库助手

public class DBHelper extends SQLiteOpenHelper {

public static String DATABASE_NAME = "gym_db";
private static final int DATABASE_VERSION = 1;

public static final String TABLE_WORKOUT = "workout_table";
public static final String WORKOUT_ID = "_id";
public static final String WORKOUT_NAME = "workout_name";

public static final String TABLE_EXERCISE = "exercise_table";
public static final String EXERCISE_ID = "exercise_id";
public static final String EXERCISE_NAME = "exercise_name";
public static final String EXERCISE_SET = "exercise_set";
public static final String EXERCISE_WEIGHT = "exercise_weight";
public static final String EXERCISE_REP = "exercise_rep";

public static final String createWorkoutTable = "CREATE TABLE" + TABLE_WORKOUT + "("
        +WORKOUT_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + WORKOUT_NAME + " TEXT NOT NULL,"+
        ");";


public static final String createExerciseTable = " CREATE TABLE " + TABLE_EXERCISE + "("
        +EXERCISE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + EXERCISE_NAME + " TEXT NOT NULL, "
        + EXERCISE_SET + " INTEGER NOT NULL, "
        + EXERCISE_WEIGHT + " INTEGER NOT NULL, "
        + EXERCISE_REP + " INTEGER NOT NULL, "
        + WORKOUT_ID + "FOREIGN KEY"+
        "(;";

我也在onUpgrade方法中开启了外键

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    super.onOpen(db);
    if (!db.isReadOnly()){
        db.execSQL("PRAGMA foreign_keys=ON;");
    }
4

1 回答 1

0
  1. 编码WORKOUT_ID + "FOREIGN KEY"不会有想要的(假设这是一个外键约束)结果。

理论上(见下文),上面将创建一个名为_id的列,其列类型为 FOREIGN KEY (将被转换/转换为NUMERIC列类型)。但是,作为FOREIGN关键字,设置列类型的尝试会因语法错误而失败。您需要指定可能是的列类型INTEGER。所以你会有WORKOUT_ID+“ INTEGER ....”。

然而FOREIGN KEY,它本身是不够的,而且在错误的地方。有两种定义 a 的方法FOREIGN KEY,作为列定义的一部分或作为表定义的一部分。

前者(列定义)不使用FOREIGN KEY关键字,但缺少的第二部分REFERENCES(即说明主表与引用的列一起)使用此方法:-

WORKOUT_ID + " INTEGER REFERENCES " + TABLE_WORKOUT +"(" + WORKOUT_ID +")"

后者(表定义)确实使用 FOREIGN KEY 关键字。您将按照以下方式对此进行编码:-

WORKOUT_ID + " INTEGER, FOREIGN KEY (" + WORKOUT_ ID + ") REFERENCES " + TABLE_WORKOUT + "(" + WORKOUT_ID + ")"

  1. 以下行将"(;"导致语法错误,它应该是");"

我还建议使用_id作为引用列的列的名称_id可能会导致混淆和困难(例如,当您使用连接进行选择时_id,结果光标中有两列)。

我建议使用不同的列名,例如锻炼 ID 参考

于 2018-04-27T20:14:06.757 回答