0

我正在尝试在我的 sqlit 数据库中插入数据,但我得到了 android SQLiteConstraintException:错误代码 19:约束失败异常。我看到这个主题有很多问题,我已经阅读并尝试了很多问题,但是仍然存在异常,我想知道这个异常是否是由自动递增 food_id 值引起的,因为插入语句返回 -1 ,并且我想知道为什么自从第一次插入 id 正确完成但后来所有插入都失败后发生此异常,为什么会发生此错误,以及我该如何解决?请帮我..

DBAdapter 类中的创建语句

private static final String Meal_TABLE_CREATE= "create table IF NOT EXISTS Meal (Date  text not null , "+
        "Time   text not null,MealType  text not null,"+ " primary key(Date,Time ,MealType) );" ;

private static final String FOOD_TABLE_CREATE= "create table IF NOT EXISTS Food (_id  INTEGER  primary key  AUTOINCREMENT  , "+
        "Food_Name   text not null,Calories  integer  not null,"+ "VB12   integer  not null,Cholesterol  integer  not null,"+ 
        "Protein   integer  not null,Iron integer  not null,Sodium integer  not null,Fat_Mono integer  not null,Fat_Sat integer  not null,carbohydrate integer  not null);" ;

private static final String MealFOOD_TABLE_CREATE= "create table IF NOT EXISTS MealFood (Date  text  not null , "+
        "Time   text not null,MealType  text not null,"+"Food_ID  integer   not null ,  primary key(Date,Time ,MealType,Food_ID) );" ;

插入方法

// insert meal  to the meal table 
public long SaveMeal(String date , String time , String mealType)
{
    ContentValues content = new ContentValues();
    content.put(KEY_MDATE,date);
    content.put(KEY_MTIME,time);
    content.put(KEY_MEALTYPE,mealType);
    return db.insert(MEAL_TABLE_NAME, null, content);

}

// insert Food  to the Food table 
public long SaveFood(String name,int calories,int Vit_B12,int cholesterol,int protein ,int iron ,int sodium,int Fat_Mono,int Fat_Sat,int carbohydrate)
{
    ContentValues content = new ContentValues();

    content.put(KEY_FOODNAME,name);
    content.put(KEY_CALORIES,calories);
    content.put(KEY_VB12,Vit_B12);
    content.put(KEY_CHOLESTEROL,cholesterol);
    content.put(KEY_PROTEIN,protein);
    content.put(KEY_IRON,iron);
    content.put(KEY_SODIUM,sodium);
    content.put(KEY_FAT_MONO,Fat_Mono);
    content.put(KEY_FAT_Sat,Fat_Sat);
    content.put(KEY_CARBOHYDRATE,carbohydrate);


    return db.insert(FOOD_TABLE_NAME, null, content);

}

// get food id by its name   

public int getFoodIDByName(String name) throws SQLException
{   int id;
Cursor cursor = null;

try{

    cursor=db.query(true,FOOD_TABLE_NAME, new String[]{KEY_FOODID},  KEY_FOODNAME+ " = '" + name + "'", null, null, null, null,null);
    if (cursor != null) {
        cursor.moveToFirst();
    }

    id=0;
    while (cursor.moveToNext()) 
        id=cursor.getInt(cursor.getColumnIndex(KEY_FOODID));

}
finally{
    cursor.close();
    cursor.deactivate(); 
}
return id;

}


// insert mealFood   to mealFood table 
public long SaveMealFood(String date , String time , String mealType, int Food_id)
{
    ContentValues content = new ContentValues();
    content.put(KEY_MFDATE,date);
    content.put(KEY_MFTIME,time);
    content.put(KEY_MFMEALTYPE,mealType);
    content.put(KEY_MFFOODID,Food_id);
    return db.insert(MEALFOOD_TABLE_NAME, null, content);

}

爪哇代码

 DBAdapter dbAdapter=new DBAdapter(SaveMeal.this);
      dbAdapter.open();
      Food n;
     String m;
     int FoodIDByName;
     for(int i = 0; i <MealActivity.array.size(); i++){
        m=MealActivity.array.get(i).toString();
        Log.e("tag", m);//selected food name
       for (int j = 0; j < MealActivity.tempList.size(); j++){
              n=MealActivity.tempList.get(j);

              if(n.getFOOD_NAME().equals(m)){
         //save food 
 long food_id = dbAdapter.SaveFood(n.getFOOD_NAME(),n.getCALORIES(),n.getFOOD_VITAMIN_B12(),n.getCHOLESTEROL(),n.getFOOD_PROTEIN(),n.getFOOD_IRON(),n.getFOOD_SODIUM(),
 n.getFOOD_MONO_UNSATURATED_FAT(),n.getFOOD_SATURATED_FAT(),n.getFOOD_TOTAL_CARBOHYDRATE()); 
  Log.e("tag", food_id+" food inserting done");

  //save meal
 long meal_id=  dbAdapter.SaveMeal( meal_date,meal_time,Meal.MEAL_TYPE);
Log.e("tag",meal_id+" meal inserting done");

//save meal_food 
 FoodIDByName=dbAdapter.getFoodIDByName(n.FOOD_NAME);
 Log.e("tag",FoodIDByName+" food_id");
    long      meal_food_id=dbAdapter.SaveMealFood(meal_date,meal_time,Meal.MEAL_TYPE,FoodIDByName);
Log.e("tag",meal_food_id+" meal_food  inserting done");
 dbAdapter.close();

此行的结果 Log.e("tag", food_id+" food inserting done"); 在我的日志中是-1

我的日志

   Database(657):at android.database.sqlite.SQLiteStatement.native_execute(Native       Method)
   Database(657):at android.database.sqlite.SQLiteStatement.execute                 (SQLiteStatement.java:55)
   Database(657):at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410)         
   -1 food inserting done
   18 meal inserting done 
   0 food_id
    13 meal_food inserting done
4

2 回答 2

0

该错误意味着您正在违反约束(显然)。很可能将“非空”列保留为空。

您也可能通过尝试多次保存相同的组合而违反了主键。

于 2012-05-12T21:21:43.913 回答
0

尝试删除所有(非空)约束,并保存空食物。如果保存正确,尝试一一添加约束(NOT NULL)。

我认为其中一个值作为 NULL 传递。

于 2012-05-13T07:16:30.170 回答