Конфликт ограничений внешнего ключа не работает в Sqlite (Android-студия) - PullRequest
0 голосов
/ 07 октября 2019

Конфликт ограничений внешнего ключа не работает. Когда я вставляю неверные данные в таблицу, она принимает. Ограничение внешнего ключа должно препятствовать вводу неверных данных в таблицу.

public class DBClass extends SQLiteOpenHelper {
    private  static  final String dname= "NutritionDatabase";
    private static final int version =4;


    public DBClass(Context context){

        super(context, dname,null, version);
    }

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        try {
            String gender_cat = "CREATE TABLE  gender_group" +
                    "(id INTEGER PRIMARY KEY," +
                    "name VARCHAR )";
            db.execSQL(gender_cat);

            String foodtbl = "CREATE TABLE Foods" +
                    "(id INTEGER PRIMARY KEY AUTOINCREMENT," +
                    "age VARCHAR ," +
                    "gender_cat INTEGER," +
                    "Food VARCHAR," +
                    "FOREIGN KEY (gender_cat) REFERENCES gender_group(id))";
            db.execSQL(foodtbl);

 }
        catch (SQLException e){
            e.printStackTrace();
        }

    }

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Я считаю, что ваша проблема в том, что вы используете db.setForeignKeyConstraintsEnabled(true); слишком поздно, и поэтому поддержка внешнего ключа не включается при вставке строк в методе onCreate .

То естьПорядок: -

  1. onConfigure
  2. onCreate
  3. onOpen

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

В связи с этим вам нужно вызвать setForeignKeyConstraintsEnabled (true) в onConfigure для поддержки внешнего ключа, который будет доступен в onCreate.

например, добавить следующее в DBClass

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

Журнал будет содержать (пойман не сбой): -

2019-10-08 08:53:58.788 E/SQLiteDatabase: Error inserting gender_cat=30 age=1 Food=Foods Data(I just remove it
    android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787 SQLITE_CONSTRAINT_FOREIGNKEY)
        at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
1 голос
/ 07 октября 2019

Попробуйте выполнить это после подключения / открытия базы данных:

PRAGMA foreign_keys = ON

Далее я предлагаю сделать sex_cat NOT NULL в вашем операторе создания таблицы, чтобы значение было принудительным. Вы не можете вставить что-либо без значения для gender_cat.

CREATE TABLE Foods(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    age VARCHAR ,
    gender_cat INTEGER NOT NULL,
    Food VARCHAR,
    FOREIGN KEY (gender_cat) REFERENCES gender_group(id))

Помогает ли это?

И, позвольте мне, предложить либо написать ваше утверждение полностью заглавными буквами, либо всеимена столбцов полностью строчные. В вашем примере age в нижнем, но Food в верхнем регистре F. Попробуйте написать структурированный, с четкой стратегией и придерживаться ее в своем дизайне. То же самое верно для ваших таблиц ... Foods против gender_group.

...