Android アプリで実行されている SQLite テーブルで更新する外部キーを取得するのに問題があります。
CASHFLOW_TABLE と ACCOUNT_TABLE の 2 つのテーブルがあります。CASHFLOW_TABLE には、ACCOUNT_TABLE の _id 列を参照する外部キー列があります。CASHFLOW_TABLE の 1 行で値を更新したいのですが、このコードを実行すると
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): UPDATE CASHFLOW_TABLE SET ACCOUNT_ID=?, VALUE=?, PURPOSE=? を使用して ACCOUNT_ID=4 VALUE=2.5 PURPOSE=Coffee を更新中にエラーが発生しました WHERE _id=?
これが CF_COL_ACCOUNT_ID が外部キーであるという事実と関係があると思う理由は、削除するときです
cv.put(CF_COL_ACCOUNT_ID, 4);
他の値だけを更新するためだけにコードを実行すると、正常に動作します。私が間違っていることはありますか?
更新: 更新を SQL ステートメントとして実行しようとすると、次のエラーが表示されます。これは、問題が外部キー制約にあることを示唆しているようです。
E/Database(24650): 'update CASHFLOW_TABLE set VALUE= 2.5, PURPOSE='coffee', ACCOUNT_ID=4 where _id = 7' を実行すると、0x314530 でエラー 19 (外部キー制約が失敗しました)
以下は、テーブルと外部キー制約を設定する onCreate() のコードです。ここでは少し簡略化しています。他の列と 1 つの外部キーがあります (3 番目のテーブルはここには示されていません)。
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);");