数据无法插入到sqlite数据库表中

时间:2012-05-12 21:01:54

标签: android sqlite

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

DBAdapter类中的create语句

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);

}

java代码

 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 +“食物插入完成”);在我的日志中是-1

mylog

   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

2 个答案:

答案 0 :(得分:0)

那个错误。意思是你。违反了一个约束(显然)。很可能将“非空”列留空。

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

答案 1 :(得分:0)

尝试删除所有(Not NULL)约束,并保存空食物。 如果保存得当,请尝试逐个添加约束(NOT NULL)。

我认为其中一个值是NULL。