1

私は listTable と productTable を呼び出す1つのテーブルを持っています。listTable で sqlite delete 関数を実行しましたが、コーディングに問題があります。productTable 内には、 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());
        }
    }

エラーメッセージ

12-02 17:27:46.232: E/error(21668): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed

list 内に製品がある場合、 deleteList(String myid) はエラーを表示します。誰が私の問題を知っていますか?外部キーの問題です。listId を deleteList(String myid) に渡します

4

1 に答える 1

0

あなたの製品はリストIDを外部キーとして持っています。そのリスト ID を外部キーとして持つすべての製品が存在しないリストに属するため、製品を含むリストを削除することはできません。

( ) に制約を設定したdb.execSQL("PRAGMA foreign_keys=ON;");ため、SQLite はこれを許可せず、表示されている例外をスローします。

つまり、制約は、リスト ID を持つすべての製品が既存のリストを参照する必要があることを示しています。

これを修正するには、削除するリストを参照するすべての productTable.listID を null にすることができます。これを自動的に行うON DELETE SET NULLには、制約に追加します。

あなたはこれを読むべきです:

http://www.sqlite.org/foreignkeys.html

于 2012-12-02T09:46:27.710 に答える