【问题标题】:perform delete row in sqlite table在 sqlite 表中执行删除行
【发布时间】:2012-12-02 09:12:55
【问题描述】:

我有一个表调用 listTable 和 productTable 。我在 listTable 中执行 sqlite 删除功能,但我的编码有问题。 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

deleteList(String myid) 如果列表中有产品,将显示错误。 有谁知道我的问题是什么?应该是外键问题。我将 listId 传递给 deleteList(String myid)

【问题讨论】:

  • 你到底得到了什么错误?
  • 如果我将产品添加到列表中,我无法删除列表 12-02 17:24:04.936: E/cannot(21033): android.database.sqlite.SQLiteConstraintException: 错误代码 19: 约束失败
  • 感觉是外键约束错误。编写查询以从表中一起删除 Product_FId 和 ListID。试试吧。它应该可以工作

标签: android sqlite


【解决方案1】:

您的产品将列表 ID 作为外键。您不能删除包含产品的列表,因为所有具有该列表 id 作为外键的产品都将属于一个不存在的列表。

您已对 (db.execSQL("PRAGMA foreign_keys=ON;");) 设置了约束,因此 SQLite 不允许您执行此操作并抛出您看到的异常。

换句话说,该约束表示所有具有列表 id 的产品都必须引用现有列表。

要解决此问题,您可以将所有引用您要删除的列表的 productTable.listID 设为空。要自动执行此操作,请将 ON DELETE SET NULL 添加到您的约束中。

您应该阅读以下内容:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2019-11-07
    • 2014-09-06
    • 2011-11-10
    相关资源
    最近更新 更多