Android

Foreign key constraints in Android using SQLite? on Delete cascade

Ограничения внешнего ключа в Android с использованием SQLite? при каскадном удалении

У меня есть две таблицы: дорожки и путевые точки, у дорожки может быть много путевых точек, но путевая точка назначается только 1 дорожке.

В таблице way points у меня есть столбец с именем "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"
+ " );"
);

...
}
Переведено автоматически
Ответ 1

Ограничения внешнего ключа при каскадном удалении поддерживаются, но их необходимо включить.
Я только что добавил следующее в свой 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
Ответ 2

Начиная с Android 4.1 (API 16) База данных SQLiteDatabase поддерживает:

public void setForeignKeyConstraintsEnabled (boolean enable)
Ответ 3

Как говорится в сообщении от е. Шишкина, начиная с API 16, вы должны включить ограничения внешнего ключа в SqLiteOpenHelper.onConfigure(SqLiteDatabase) методе, используя db.setForeignKeyConstraintsEnabled(boolean)

@Override
public void onConfigure(SQLiteDatabase db){
db.setForeignKeyConstraintsEnabled(true);
}
Ответ 4

Никогда не бывает слишком старого вопроса, чтобы дать более полный ответ.

@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);
}
2023-03-10 21:34 java android sqlite