Java Android中的Sqlite替换和外键

Java Android中的Sqlite替换和外键,java,android,sql,sqlite,Java,Android,Sql,Sqlite,我有以下表格结构: Table Days: [_id,date,name] ^ | Table Events: [_id, day_id ,description] 外键day_id设置为ON DELETE CASCADE 我想“插入或更新”第2天。因此,我提出: ContentValues values= new ContentValues(); values.put("_id",2

我有以下表格结构:

Table Days:          [_id,date,name]
                       ^
                       |
Table Events: [_id, day_id ,description]
外键day_id设置为ON DELETE CASCADE

我想“插入或更新”第2天。因此,我提出:

ContentValues values= new ContentValues();
values.put("_id",2);
values.put("date,"...");
values.put("name","welcome");
mDb.replace("days",null,values);
问题是,如果天_id=2已经存在(在我的例子中是最有可能的选项),DBengine将删除表并插入新行,因此与该天关联的所有事件也将被删除

这个解决方案是可行的,但它是次优的,对吗

    try {
        mDb.insertOrThrow("days", null, values);
    } catch (Exception e) {
        mDb.update("days", values, "_id=2", null);
    }

该问题的正确解决方法是什么?

您应该按以下方式添加引用,以便SQLite自动删除或更新引用的列

外键[_id]在更新时删除级联时引用[days] 级联


为了允许SQLite自动删除或更新引用的列,您应该如下所示添加引用

外键[_id]在更新时删除级联时引用[days] 级联


谢谢你的回答。我不想更新day _id,只是“插入或更新”它,但该指令在sqlite中不存在,对吗?(使用“替换”,在插入“更新的一行”之前删除旧行时,在级联上删除与日期关联的事件。)如果更新主键,“更新级联”将自动反映其引用列中的更改,因此您不必担心删除然后插入它,但“替换”命令会(删除+插入)如果列已存在,则自动执行=(你说的替换命令是什么意思?你不是只依赖外键级联吗?这个答案不应该被标记为已接受,因为它不能解决OP的问题。我发现了另一个可以解决这个问题的方法:–使用删除触发器。谢谢你的回答。我不想更新当天的id,只想“插入或更新”但该指令在sqlite中不存在,对吗?(使用replace在插入“更新的一行”之前删除旧行时,在级联上删除与日期关联的事件)如果更新主键,“更新时级联”将自动反映其引用列中的更改,因此无需担心删除然后插入主键,但如果列已存在,则“替换”命令会自动生成(删除+插入)=(你说的替换命令是什么意思?你不是只依赖外键级联吗?这个答案不应该被标记为接受,因为它不能解决OP的问题。我发现了另一件可以解决这个问题的事情:–使用delete trigger。