使用ContentValues和update()更新SQLite中的外键字段

时间:2012-04-22 08:11:52

标签: sqlite

我无法在我的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 /数据库(22962):更新错误ACCOUNT_ID = 4 VALUE = 2.5 PURPOSE =咖啡使用UPDATE CASHFLOW_TABLE SET ACCOUNT_ID = ?, VALUE = ?, PURPOSE =? WHERE _id =?

我认为这与CF_COL_ACCOUNT_ID是外键的事实有关的原因是当我删除时

    cv.put(CF_COL_ACCOUNT_ID, 4);

并运行代码只是为了更新其他值,它工作正常。我有什么想法吗?

更新:当我尝试将更新作为SQL语句运行时,我收到以下错误,这似乎表明问题与外键约束有关:

E /数据库(24650):执行'更新CASHFLOW_TABLE时设置VALUE = 2.5,PURPOSE ='咖啡',ACCOUNT_ID = 4,其中_id = 7'

,故障19(外键约束失败)在0x314530上

下面是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);");

0 个答案:

没有答案