Есть две потенциальные проблемы (из-за ограниченного кода при условии, что невозможно точно сказать, почему вставляются 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) )";