внешний ключ не отображается как ноль после ввода - PullRequest
0 голосов
/ 18 июня 2019

Я создал класс dabasehelper с тремя таблицами, я хочу, чтобы первичным ключом таблицы ученика был внешний ключ в таблице examResult.Но когда я ввожу данные в таблицу examResult, он отображает столбец внешнего ключа как ноль

  public void onCreate(SQLiteDatabase db) {

        String query2 = "CREATE TABLE IF NOT EXISTS \"student_and_parent_table1\" ( `ID` integer PRIMARY KEY AUTOINCREMENT, `Name` TEXT, `FatherName` TEXT, `MotherName` TEXT, `ParentEmail` TEXT, `FatherPhoneNumber` INTEGER, `MotherPhoneNumber` INTEGER, `Address` TEXT, `Username` TEXT, `Password` TEXT)";
        db.execSQL(query2);


        String query3 = "CREATE TABLE IF NOT EXISTS \"teacher_table1\" ( `ID` integer PRIMARY KEY AUTOINCREMENT, `Name` TEXT, `Email` TEXT, `MobileNumber` INTEGER, `Username` TEXT, `Password` text, `Address` text, `Qualification` TEXT )";
        db.execSQL(query3);

       String query4 = "CREATE TABLE IF NOT EXISTS \"exam_table1\" ( `StudentID` INTEGER PRIMARY KEY AUTOINCREMENT, `StudentName` TEXT,  `SubjectName` TEXT, `SubjectCode` TEXT, `MaxMarks` INTEGER, `MarksScoredByStudent` INTEGER, `Grade` TEXT, `StudentRegNo` integer, FOREIGN KEY(StudentRegNo) REFERENCES student_and_parent_table1(ID) )";
        db.execSQL(query4);

1 Ответ

0 голосов
/ 18 июня 2019

Есть две потенциальные проблемы (из-за ограниченного кода при условии, что невозможно точно сказать, почему вставляются NULL) .

Проблема 1 - Поддержка внешнего ключа

Во-первых, по умолчанию поддержка внешнего ключа отключена и поэтому должна быть включена. Чтобы включить поддержку внешнего ключа, вы можете переопределить метод onConfigure помощника базы данных, чтобы вызвать SQLiteDatabase setForeignKeyConstraintsEnabled метод, например,

@Override
public void onConfigure(SQLiteDatabase db) {
    super.onConfigure(db);
    db.setForeignKeyConstraintsEnabled(true);
}

Выпуск 2 - Ограничения

Второе - распространенное заблуждение о том, что такое Foreign Keys.

Когда вы определяете внешний ключ, вы просто добавляете ограничение (правило), которое говорит, что значение в дочернем столбце ДОЛЖНО быть значением, которое существует в родительском столбце. NULL является исключением / особым случаем, который указывает на отсутствие связи с родителем (если только ограничение NOT NULL не применяется к дочернему столбцу).

Распространенным заблуждением является то, что при указании внешнего ключа автоматически присваиваются значения, но это не так, он только проверяет, является ли вставляемое значение допустимым, вам все равно необходимо программно определить значение, которое будет вставлено.

Таким образом, вы можете добавить ограничение NOT NULL в дочерний столбец ( StudentRegNo ), что приведет к использованию допустимого значения.

например. использовать: -

String query4 = "CREATE TABLE IF NOT EXISTS \"exam_table1\" ( `StudentID` INTEGER PRIMARY KEY AUTOINCREMENT, `StudentName` TEXT,  `SubjectName` TEXT, `SubjectCode` TEXT, `MaxMarks` INTEGER, `MarksScoredByStudent` INTEGER, `Grade` TEXT, `StudentRegNo` integer NOT NULL, FOREIGN KEY(StudentRegNo) REFERENCES student_and_parent_table1(ID) )";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...