sqlite android studio中的外键关系不起作用

问题描述 投票:-2回答:1

我正在两个表之间创建关系,但是外键关系不起作用。有人可以帮忙为什么此代码不起作用吗?

这是我完整的代码。

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);
    }
}
android sqlite android-sqlite android-studio-3.0
1个回答
0
投票

最可能的原因是您尚未打开外键支持。

默认情况下,此功能处于关闭状态,在这种情况下,尽管用于创建表的SQL在语法上是正确的,但不执行外键约束冲突检查,并且不执行On Update / OnDelete操作(例如CASCADE)。] >

通常,您将通过覆盖调用setForeignKeyConstraintsEnabled方法的onConfigure方法来打开外键支持。

例如将此添加到您的DBClass.java

@Override
public void onConfigure(SQLiteDatabase db) {
    super.onConfigure(db);
    db.setForeignKeyConstraintsEnabled(true);
}
© www.soinside.com 2019 - 2024. All rights reserved.