为了账号安全,请及时绑定邮箱和手机立即绑定

Android中使用SQLite的外键约束?在删除级联

Android中使用SQLite的外键约束?在删除级联

白猪掌柜的 2019-08-26 09:36:39
Android中使用SQLite的外键约束?在删除级联我有两个表:轨道和航点,一个轨道可以有很多航点,但一个航点只分配给一个轨道。在点数表中,我有一个名为“trackidfk”的列,它在制作轨道时插入track_ID,但是我没有在此列上设置外键约束。当我删除一条轨道时,我想删除指定的路标,这可能吗?我读过有关使用触发器的内容,但我不认为它们在Android中受支持。要创建航点表:public void onCreate(SQLiteDatabase db) {     db.execSQL( "CREATE TABLE " + TABLE_NAME                  + " ("                  + _ID         + " INTEGER PRIMARY KEY AUTOINCREMENT, "                  + LONGITUDE   + " INTEGER,"                  + LATITUDE    + " INTEGER,"                  + TIME        + " INTEGER,"                 + TRACK_ID_FK + " INTEGER"                 + " );"               );     ...}
查看完整描述

3 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

支持使用on delete cascade的外键约束,但您需要启用它们。
我刚刚将以下内容添加到我的SQLOpenHelper中,这似乎可以解决问题。

@Overridepublic void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    if (!db.isReadOnly()) {
        // Enable foreign key constraints
        db.execSQL("PRAGMA foreign_keys=ON;");
    }}

我将我的引用列声明如下。

mailbox_id INTEGER REFERENCES mailboxes ON DELETE CASCADE


查看完整回答
反对 回复 2019-08-26
?
当年话下

TA贡献1890条经验 获得超9个赞

用更完整的答案回答问题永远不会过于陈旧。

@Override public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    if (!db.isReadOnly()) {
        setForeignKeyConstraintsEnabled(db);
    }
    mOpenHelperCallbacks.onOpen(mContext, db);}private void setForeignKeyConstraintsEnabled(SQLiteDatabase db) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
        setForeignKeyConstraintsEnabledPreJellyBean(db);
    } else {
        setForeignKeyConstraintsEnabledPostJellyBean(db);
    }}private void setForeignKeyConstraintsEnabledPreJellyBean(SQLiteDatabase db) {
    db.execSQL("PRAGMA foreign_keys=ON;");}@TargetApi(Build.VERSION_CODES.JELLY_BEAN)private void setForeignKeyConstraintsEnabledPostJellyBean(SQLiteDatabase db) {
    db.setForeignKeyConstraintsEnabled(true);}


查看完整回答
反对 回复 2019-08-26
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

无论@phil提到什么都是好的。但您可以使用Database自身中可用的另一种默认方法来设置外键。那就是setForeignKeyConstraintsEnabled(true)。

@Overridepublic void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    if (!db.isReadOnly()) {
        // Enable foreign key constraints
        db.execSQL("PRAGMA foreign_keys=ON;"); 
              //(OR)
        db.setForeignKeyConstraintsEnabled (true)
    }}

对于Docs,请参阅SQLiteDatabase.setForeignKeyConstraintsEnabled


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 1259 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信