java add - Ограничения внешнего ключа в Android с помощью SQLite? on Удалить каскад




foreign key (9)

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

В том, что касается таблицы точек, у меня есть столбец с названием «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"
                + " );"
              );

    ...
}

Answers

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

public void setForeignKeyConstraintsEnabled (boolean enable)

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

@Override
public void onConfigure(SQLiteDatabase db){
    db.setForeignKeyConstraintsEnabled(true);
}

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


Внешние ключи с "on delete cascade" поддерживаются в SQLite в Android 2.2 и выше. Но будьте осторожны при их использовании: иногда возникает ошибка при запуске одного внешнего ключа в одном столбце, но реальная проблема заключается в любом другом внешнем ключевом ограничении в дочерней таблице, или какая-либо другая таблица тета ссылается на эту таблицу.

Похоже, SQLite проверяет все ограничения при запуске одного из них. Это фактически упоминается в документации. Проверки ограничений DDL и DML.


Я не думаю, что SQLite поддерживает это из коробки. Что я делаю в своих приложениях:

  1. Создать транзакцию
  2. Удалить подробные данные (путевые точки в вашем примере)
  3. Удалить основные данные (дорожки в вашем примере)
  4. Зафиксировать транзакцию с успехом

Таким образом, я уверен, что либо все данные удалены, либо нет.


Что бы ни сказал @phil, это хорошо. Но вы можете использовать другой метод по умолчанию, доступный в самой базе данных, для установки внешнего ключа. Это setForeignKeyConstraintsEnabled (true).

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

Для Документов обратитесь к SQLiteDatabase.setForeignKeyConstraintsEnabled


Версия SQLite в android 1.6 - 3.5.9, поэтому она не поддерживает внешние ключи ...

http://www.sqlite.org/foreignkeys.html "В этом документе описывается поддержка ограничений внешнего ключа SQL, введенных в SQLite версии 3.6.19."

В Froyo это SQLite версии 3.6.22, поэтому ...

EDIT: посмотреть версию sqlite: adb shell sqlite3 -version


Ответ Slanec верен - у WebDriver нет собственных возможностей для этого. Как я решил это в Windows с объектом System.Windows.Forms.SendKeys:

    SendKeys.SendWait("^p");
    System.Threading.Thread.Sleep(500);
    SendKeys.SendWait("~");

    // give it a minute to spool onto the printer
    System.Threading.Thread.Sleep(5000);

Я на самом деле получил это в цикле, распечатав кучу утверждений. Работает как шарм.







java android sqlite foreign-keys