2012-05-12 1 views
0

sqlitデータベースにデータを挿入しようとしていますが、アンドロイドを取得しました。SQLiteConstraintException:エラーコード19:制約が例外に失敗しました。私はこのトピックで質問のトンが見た、私はそれらの束を読んでみましたが、例外は、私はこの例外は、自動インクリメントのfood_id値によって引き起こされたのだろうか?この例外がなぜ最初に挿入されたIDが正しく行われたが、後で挿入するすべてが失敗したのか、なぜこのエラーが発生したのか、そしてどのように解決できるのだろうと思いますか?私を助けてください..データがsqlitデータベーステーブルに挿入されない

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

} 

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 inserted done");私のログである-1あなたは(明らかに)制約をare.violating error.means

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 

答えて

0

すべての(NULLではない)制約を削除し、空のフードを保存してみます。 正しく保存されている場合は、制約(NOT NULL)を1つずつ追加してみてください。

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

+0

はい食べ物テーブルの主キーは、食べ物テーブルにデータを挿入しようとしたときに初めて作成され、自動値を持っていましたが、その値は常にゼロであり、私は、自動増分主キーが正しくない挿入するために使用する方法ですか? – user

+0

主キーのIDを_idから別のものに変更しようとすると、それがアンドロイド自身によって使用されている可能性があります。 –

0

。ほとんどの場合、nullでない列はnullのままにしておきます。

同じ組み合わせを複数回保存しようとすると、プライマリキーに違反している可能性もあります。

+0

私はすべての値をテーブルに挿入しました。食べ物テーブルはfood_id(_id)以外のすべての値を挿入しました。 – user

+0

私は助けてください.... – user

+0

可能性のある別の制約違反で私の答えが更新されました。 – Barak

関連する問題