У меня есть две таблицы: дорожки и путевые точки, дорожка может иметь много путевых точек, но путевая точка назначается только одной дорожке.
В таблице путевых точек у меня есть столбец «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"
+ " );"
);
...
}
Ограничения внешнего ключа с каскадом удаления поддерживаются, но вам необходимо включить их.
Я только что добавил следующее в свой SQLOpenHelper , который, похоже, помогает.
@Override
public 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
Я не думаю, что SQLite поддерживает это из коробки. В своих приложениях я делаю следующее:
Это Кстати я уверен, что либо все данные удалены, либо нет.
Триггеры поддерживаются Android, и такой тип каскадного удаления не поддерживается sqlite. Пример использования триггеров на android можно найти здесь . Хотя использование транзакций, как заявил Торстен, вероятно, так же просто, как триггер.
Версия SQLite в android 1.6 - 3.5.9, поэтому внешние ключи не поддерживаются ...
http://www.sqlite.org/foreignkeys.html «В этом документе описывается поддержка ограничений внешнего ключа SQL, представленных в SQLite версии 3.6.19.»
В Froyo это SQLite версии 3.6.22, так что ...
РЕДАКТИРОВАТЬ: чтобы увидеть версию sqlite: adb shell sqlite3 -version