作为项目的一部分,我正在制作用于跟踪用户在健身房锻炼的Android应用程序。随着锻炼和锻炼与各种设置,重量和代表。这将是与锻炼ID为外键的1:M关系。我还是android和sqlite的新手,所以我只是想在下面检查下面的代码是否正确。
非常感谢任何建议
DBHelper
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;");
}
答案 0 :(得分:0)
WORKOUT_ID + "FOREIGN KEY"
将没有所需的(假设这是一个外键约束)结果。理论上(见下文),上面会创建一个名为 _id 的列,其列类型为FOREIGN KEY(可以转换/转换为 NUMERIC )。但是,由于FOREIGN
是关键字,因此尝试设置列类型将失败并出现语法错误。您需要指定可能为INTEGER
的列类型。所以你会WORKOUT_ID
+" INTEGER ...."。
然而,FOREIGN KEY
对它自己来说是不够的,也是在错误的地方。
定义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 + ")"
"(;"
会导致语法错误");"
。我还建议使用 _id
作为引用 _id
列的列的名称可能会导致混淆困难(例如,当您使用联接进行选择时,您在结果Cursor中有两个 _id
列。
我建议使用不同的列名,例如 workout_id_reference 。