外键约束冲突在Sqlite(android studio)中不起作用
外键约束冲突不起作用。当我向表中插入无效数据时,它正在接受。外键约束应防止在表中输入无效数据外键约束冲突在Sqlite(android studio)中不起作用,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,外键约束冲突不起作用。当我向表中插入无效数据时,它正在接受。外键约束应防止在表中输入无效数据 public class DBClass extends SQLiteOpenHelper { private static final String dname= "NutritionDatabase"; private static final int version =4; public DBClass(Context context){ supe
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();
}
}
连接/打开数据库后尝试执行此操作:
PRAGMA foreign_keys = ON
接下来,我建议在CREATETABLE语句中使SEQUEND_cat不为NULL
,以便强制执行该值。如果没有gender\u 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
vsgender\u group
连接/打开数据库后尝试执行此操作:
PRAGMA foreign_keys = ON
接下来,我建议在CREATETABLE语句中使SEQUEND_cat不为NULL
,以便强制执行该值。如果没有gender\u 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
vsgender\u group
我认为您的问题在于您正在使用db.setForeignKeyConstraintEnabled(true)代码>太晚,因此在onCreate方法中插入行时,外键支持未启用
即顺序是:-
地貌
一次创建
奥诺彭
i、 e.插入行时,由于外键支持尚未启用,不会发生外键约束冲突,并且插入了胭脂行
因此,您需要在onConfigure中调用setForeignKeyConstraintEnabled(true),以便在onCreate中提供外键支持
e、 g.将以下内容添加到DBClass中
@Override
public void onConfigure(SQLiteDatabase db) {
db.setForeignKeyConstraintsEnabled(true);
super.onConfigure(db);
}
日志将包含以下内容(不是崩溃):-
我相信您的问题在于您使用的是db.setForeignKeyConstraintEnabled(true)代码>太晚,因此在onCreate方法中插入行时,外键支持未启用
即顺序是:-
地貌
一次创建
奥诺彭
i、 e.插入行时,由于外键支持尚未启用,不会发生外键约束冲突,并且插入了胭脂行
因此,您需要在onConfigure中调用setForeignKeyConstraintEnabled(true),以便在onCreate中提供外键支持
e、 g.将以下内容添加到DBClass中
@Override
public void onConfigure(SQLiteDatabase db) {
db.setForeignKeyConstraintsEnabled(true);
super.onConfigure(db);
}
日志将包含以下内容(不是崩溃):-
您是否仔细阅读并完成了它所说的每次连接到数据库时打开外键强制执行的操作?您是否仔细阅读并完成了它所说的每次连接到数据库时打开外键强制执行的操作?非常感谢。。它正在工作。。请再来一个。如何编写内部联接查询以从这两个表中检索数据。@kinzaAkbar,如果答案有帮助,请将其勾选为已回答。重新连接这里有两个基本选择,从每个角度连接表SELECT*from Foods join gender\u group ON gender\u cat=gender\u group.id代码>和从性别组选择*在性别组=性别组id上加入食物代码>(请注意,由于id是不明确的(即哪个id),因此table.column用于消除联接方面的不明确性)。非常感谢。。它正在工作。。请再来一个。如何编写内部联接查询以从这两个表中检索数据。@kinzaAkbar,如果答案有帮助,请将其勾选为已回答。重新连接这里有两个基本选择,从每个角度连接表SELECT*from Foods join gender\u group ON gender\u cat=gender\u group.id代码>和从性别组选择*在性别组=性别组id上加入食物代码>(请注意,由于id是不明确的(即哪个id),因此table.column用于消除连接方面的不明确性)。