我正在两个表之间创建关系,但是外键关系不起作用。有人可以帮忙为什么此代码不起作用吗?
这是我完整的代码。
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);
InsertGenderCat(1,"Men",db);
InsertGenderCat(2,"Women",db);
InsertGenderCat(3,"Toddlers",db);
InsertGenderCat(4,"Olders",db);
insertFoods("12",2,"Calories Required \n 45 to 55 calories per kg.\n\n Protein \n 1 gram per kg. \n\n Breads or Starches. \n 1 bagel or muffin.\n 2 slices bread.\n 1/2 cup cooked cereal, pasta, potatoes, or rice. \n\n Fruits:\n 1/2 cup canned fruit or fruit juice. \n 1 piece fresh fruit, such as an apple, orange, peach, or pear. \n\n 15 to 20 grapes.\n\n Meat or Meat Substitutes:\n 1/2 cup cottage or ricotta cheese. \n 3/4 to 1 cup cooked dried beans or legumes. \n 1 egg.\n 2 to 3 ounces meat, fish, or poultry.\n\n Milk or Yogurt\n 1 cup milk or yogurt.\n\n Vegetables:\n 1/2 cup cooked or 1 cup raw vegetable. \n 2 cups salad greens. \n\n Fats\n 6 almonds or 10 peanuts.\n 2 Tbsps cream cheese, avocado, or low calorie salad dressing.\n\nSweets and Desserts .",db);
insertFoods("13",2,"Calories Required \n 45 to 55 calories per kg.\n\n Protein \n 1 gram per kg. \n\n Breads or Starches. \n 1 bagel or muffin.\n 2 slices bread.\n 1/2 cup cooked cereal, pasta, potatoes, or rice. \n\n Fruits:\n 1/2 cup canned fruit or fruit juice. \n 1 piece fresh fruit, such as an apple, orange, peach, or pear. \n\n 15 to 20 grapes.\n\n Meat or Meat Substitutes:\n 1/2 cup cottage or ricotta cheese. \n 3/4 to 1 cup cooked dried beans or legumes. \n 1 egg.\n 2 to 3 ounces meat, fish, or poultry.\n\n Milk or Yogurt\n 1 cup milk or yogurt.\n\n Vegetables:\n 1/2 cup cooked or 1 cup raw vegetable. \n 2 cups salad greens. \n\n Fats\n 6 almonds or 10 peanuts.\n 2 Tbsps cream cheese, avocado, or low calorie salad dressing.\n\nSweets and Desserts .",db);
insertFoods("14",2,"Calories Required \n 45 to 55 calories per kg.\n\n Protein \n 1 gram per kg. \n\n Breads or Starches. \n 1 bagel or muffin.\n 2 slices bread.\n 1/2 cup cooked cereal, pasta, potatoes, or rice. \n\n Fruits:\n 1/2 cup canned fruit or fruit juice. \n 1 piece fresh fruit, such as an apple, orange, peach, or pear. \n\n 15 to 20 grapes.\n\n Meat or Meat Substitutes:\n 1/2 cup cottage or ricotta cheese. \n 3/4 to 1 cup cooked dried beans or legumes. \n 1 egg.\n 2 to 3 ounces meat, fish, or poultry.\n\n Milk or Yogurt\n 1 cup milk or yogurt.\n\n Vegetables:\n 1/2 cup cooked or 1 cup raw vegetable. \n 2 cups salad greens. \n\n Fats\n 6 almonds or 10 peanuts.\n 2 Tbsps cream cheese, avocado, or low calorie salad dressing.\n\nSweets and Desserts .",db);
insertFoods("15",2,"Total Calories Required \n 40 to 45 calories per kg.\n\n Protein \n 0.9 grams per kg. \n\n Breads or Starches::1/2 cup cottage or ricotta cheese.3/4 to 1 cup cooked dried beans or legumes.\n 1 egg.2 to 3 ounces meat, fish, or poultry.\n Milk or Yogurt \n 1 cup milk or yogurt.\n\n Vegetables:\n 1/2 cup cooked or 1 cup raw vegetable.\n 2 cups salad greens.\n\n Fats\n 6 almonds or 10 peanuts.\n 2 Tbsps cream cheese, avocado, or low calorie salad dressing.\n\n Sweets and Desserts .",db);
insertFoods("16",2,"Total Calories Required \n 40 to 45 calories per kg.\n\n Protein \n 0.9 grams per kg. \n\n Breads or Starches::1/2 cup cottage or ricotta cheese.3/4 to 1 cup cooked dried beans or legumes.\n 1 egg.2 to 3 ounces meat, fish, or poultry.\n Milk or Yogurt \n 1 cup milk or yogurt.\n\n Vegetables:\n 1/2 cup cooked or 1 cup raw vegetable.\n 2 cups salad greens.\n\n Fats\n 6 almonds or 10 peanuts.\n 2 Tbsps cream cheese, avocado, or low calorie salad dressing.\n\n Sweets and Desserts .",db);
insertFoods("17",2,"Total Calories Required \n 40 to 45 calories per kg.\n\n Protein \n 0.9 grams per kg. \n\n Breads or Starches::1/2 cup cottage or ricotta cheese.3/4 to 1 cup cooked dried beans or legumes.\n 1 egg.2 to 3 ounces meat, fish, or poultry.\n Milk or Yogurt \n 1 cup milk or yogurt.\n\n Vegetables:\n 1/2 cup cooked or 1 cup raw vegetable.\n 2 cups salad greens.\n\n Fats\n 6 almonds or 10 peanuts.\n 2 Tbsps cream cheese, avocado, or low calorie salad dressing.\n\n Sweets and Desserts .",db);
//here i entered gender_cat 30 , which is invalid but it is accepting.
insertFoods("1",30, "Foods Data(I just remove it",db);
}
catch (SQLException e){
e.printStackTrace();
}
}
private void InsertGenderCat(Integer id, String group, SQLiteDatabase db){
ContentValues values = new ContentValues();
values.put("id",id);
values.put("name",group);
db.insert("gender_group", null,values);
}
private void insertFoods(String age,Integer cat, String food, SQLiteDatabase db){
ContentValues values = new ContentValues();
values.put("age",age);
values.put("gender_cat",cat);
values.put("Food",food);
db.insert("Foods", null,values);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String genderTbl ="DROP TABLE IF EXISTS gender_categories";
db.execSQL(genderTbl);
String foodsTbl ="DROP TABLE IF EXISTS Foods";
db.execSQL(foodsTbl);
}
}
最可能的原因是您尚未打开外键支持。
默认情况下,此功能处于关闭状态,在这种情况下,尽管用于创建表的SQL在语法上是正确的,但不执行外键约束冲突检查,并且不执行On Update / OnDelete操作(例如CASCADE)。] >
通常,您将通过覆盖调用setForeignKeyConstraintsEnabled方法的onConfigure方法来打开外键支持。
例如将此添加到您的DBClass.java
@Override
public void onConfigure(SQLiteDatabase db) {
super.onConfigure(db);
db.setForeignKeyConstraintsEnabled(true);
}