SQLite 1:M关系

时间:2018-04-27 11:57:05

标签: java android sqlite android-sqlite

作为项目的一部分,我正在制作用于跟踪用户在健身房锻炼的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;");
    }

1 个答案:

答案 0 :(得分:0)

  1. 编码WORKOUT_ID + "FOREIGN KEY"将没有所需的(假设这是一个外键约束)结果。
  2. 理论上(见下文),上面会创建一个名为 _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 + ")"
    
    1. 以下行"(;"会导致语法错误");"
    2. 我还建议使用 _id 作为引用 _id 列的列的名称可能会导致混淆困难(例如,当您使用联接进行选择时,您在结果Cursor中有两个 _id 列。

      我建议使用不同的列名,例如 workout_id_reference