1

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);");
4

0 に答える 0