i have one table call listTable and productTable . I perform sqlite delete function in listTable , but something wrong in my coding . Inside productTable have Foreign key reference to primary key in listTable .
SQLiteHelper.java
public class SQLiteHelper extends SQLiteOpenHelper {
public static final String dbName = "shoppingDB1.db";
public static final int dbVersion = 1;
public static final String listTable = "ShoppingList";
public static final String listId = "ShopingList_Id";
public static final String listName = "ShopingList_Name";
public static final String productTable = "Product";
public static final String product_id = "Product_Id";
public static final String productName = "Product_Name";
public static final String product_FId = "Product_FId";
private static final String CREATE_SHOPPLINGLIST_TABLE = "CREATE TABLE IF NOT EXISTS "
+ listTable
+ " ("
+ listId
+ " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ listName
+ " TEXT ")";
private static final String CREATE_PRODUCT_TABLE = "CREATE TABLE IF NOT EXISTS "
+ productTable
+ " ("
+ product_id
+ " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ productName
+ " TEXT, "+ product_FId
+ " INTEGER NOT NULL, "
FOREIGN KEY ("
+ product_FId
+ ") REFERENCES "
+ listTable
+ " ("
+ listId
+ ")
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_SHOPPLINGLIST_TABLE);
db.execSQL(CREATE_PRODUCT_TABLE);
}
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
if (!db.isReadOnly()) {
// Enable foreign key constraints
db.execSQL("PRAGMA foreign_keys=ON;");
}
}
ComicsData.java
public class ComicsData {
public ComicsData(Context context) {
dbHelper = new SQLiteHelper(context);
}
public void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}
public void deleteList(String myid) {
// TODO Auto-generated method stub
String[] arg={myid};
try{
database.delete(SQLiteHelper.listTable, SQLiteHelper.listId+ " = ?",arg);
}catch(Exception e){
Log.e("cannot", e.toString());
}
}
error message
12-02 17:27:46.232: E/error(21668): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
deleteList(String myid) will display error if there have product inside the list .
anyone know what is my problem ? should the foreign key problem . I passing listId to deleteList(String myid)
Your products have the list id as a foreign key. You cannot delete a list which contains a product since all products which have that list id as a foreign key would then belong to a non-existent list.
You have set constraints on (
db.execSQL("PRAGMA foreign_keys=ON;");) therefore SQLite will not allow you to do this and throws the exception you are seeing.In other words, the constraint says that all products that have a list id must refer to an existing list.
To fix this, you could null all productTable.listIDs that reference the list you want to delete. To do this automatically, add
ON DELETE SET NULLto your constraint.You should read this:
http://www.sqlite.org/foreignkeys.html