0

sqlit データベースにデータを挿入しようとしていますが、android SQLiteConstraintException: error code 19: constraint failed exception が発生しました。このトピックにはたくさんの質問があるのを見ました。私はそれらの束を読んで試しましたが、例外はまだあります。挿入ステートメントが -1 を返すため、この例外は自動インクリメント food_id 値によって引き起こされたのではないかと思います。最初の挿入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+" 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

すべての (Not NULL) 制約を削除して、空の食品を保存してみてください。正しく保存されている場合は、制約 (NOT NULL) を 1 つずつ追加してみてください。

値の 1 つが NULL として渡されると思います。

于 2012-05-13T07:16:30.170 に答える
0

そのエラーは、(明らかに) 制約に違反していることを意味します。ほとんどの場合、「not null」列を null のままにします。

同じ組み合わせを複数回保存しようとして、主キーに違反した可能性もあります。

于 2012-05-12T21:21:43.913 に答える