1

我无法在我的 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);");
4

0 回答 0