我无法在我的 Android 应用程序中运行的 SQLite 表中获取要更新的外键。
我有两张表,CASHFLOW_TABLE 和 ACCOUNT_TABLE。CASHFLOW_TABLE 有一个引用 ACCOUNT_TABLE 的 _id 列的外键列。我想更新一行 CASHFLOW_TABLE 中的值,但是当我运行此代码时
String where = "_id=?";
String[] whereArgs = {"7"};
ContentValues cv = new ContentValues();
cv.put(CF_COL_PURPOSE, "Coffee");
cv.put(CF_COL_VALUE, 2.5);
cv.put(CF_COL_ACCOUNT_ID, 4);
myDatabase.update(CF_TABLE_NAME, cv, where, whereArgs);
我收到错误消息:
E/Database(22962):错误更新 ACCOUNT_ID=4 VALUE=2.5 PURPOSE=Coffee 使用 UPDATE CASHFLOW_TABLE SET ACCOUNT_ID=?, VALUE=?, PURPOSE=? 在哪里_id =?
我认为这与 CF_COL_ACCOUNT_ID 是外键这一事实有关的原因是,当我删除
cv.put(CF_COL_ACCOUNT_ID, 4);
并运行代码只是为了更新其他值,它工作正常。任何想法我做错了什么?
更新:当我尝试将更新作为 SQL 语句运行时,出现以下错误,这似乎表明问题出在外键约束上:
E/Database(24650):执行“更新 CASHFLOW_TABLE set VALUE= 2.5, PURPOSE='coffee', ACCOUNT_ID=4 where _id = 7' 时在 0x314530 出现故障 19(外键约束失败)
下面是 onCreate() 中设置表和外键约束的代码。我在这里稍微简化了一点——还有其他列和一个其他外键(对于此处未显示的第三个表)。
db.execSQL("Create table " + A_TABLE_NAME + " (" + A_COL_ID + " integer primary key autoincrement, " + A_COL_NAME
+ " text default ('" + A_DEFAULT_ACCOUNT + "'));");
db.execSQL("Create table " + CF_TABLE_NAME + " (" + CF_COL_ID
+ " integer primary key autoincrement, " + CF_COL_VALUE
+ " real not null, "
+ CF_COL_PURPOSE + " text not null, " + CF_COL_TIMESTAMP
+ " text not null default (strftime('%s','now')), "
+ CF_COL_ACCOUNT_ID
+ " integer not null default 1, foreign key ("
+ CF_COL_ACCOUNT_ID + ") references " + A_TABLE_NAME + " ("
+ A_COL_ID + ") on delete set default);");