SQLite 1: M отношения - PullRequest
       7

SQLite 1: M отношения

0 голосов
/ 27 апреля 2018

В рамках проекта я делаю приложение для Android, которое отслеживает тренировки пользователей в тренажерном зале. С тренировками и упражнениями с различным набором, весом и повторениями. Это будет отношение 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 голосов
/ 27 апреля 2018
  1. Кодирование WORKOUT_ID + "FOREIGN KEY" не будет иметь желаемого (при условии, что это ограничение внешнего ключа) результата.

Теоретически (см. Позже) приведенное выше создаст столбец с именем _id с типом столбца FOREIGN KEY (который будет переведен / преобразован в тип столбца NUMERIC ) , Однако, поскольку FOREIGN является ключевым словом, попытка установить тип столбца завершится неудачно с синтаксической ошибкой. Вам необходимо указать тип столбца, который, вероятно, будет INTEGER. Таким образом, у вас будет WORKOUT_ID + "INTEGER ....".

Однако FOREIGN KEY сам по себе недостаточен и тоже не в том месте. Существует два способа определения FOREIGN KEY, как часть определения столбца или как часть определения таблицы.

В первом (определение столбца) не используется ключевое слово FOREIGN KEY, а пропущенная 2-я часть - 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 в результирующем курсоре).

Я бы предложил использовать другое имя столбца, например, workout_id_reference .

...