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
当年话下
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);}
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
添加回答
举报
0/150
提交
取消