ON DELETE CASCADE не работает в sqlite3 в ios

Я создал файл .sqlite в ios программно, как показано ниже, включив внешние ключи прагмы.

    NSFileManager *theFileManager = [NSFileManager defaultManager];
    if ([theFileManager fileExistsAtPath:[self getDatabasePath]] == NO)
    {
        char *theError;
        const char *databasePath = [[self getDatabasePath] UTF8String];
        const char *enableForienKey = [@"PRAGMA foreign_keys = ON;" UTF8String];

        if (sqlite3_open(databasePath, &mDatabase) == SQLITE_OK)
        {
            if (sqlite3_exec(mDatabase, enableForienKey, NULL, NULL, &theError)!=SQLITE_OK)
            {
                DEBUGLOG(kCreateTableError,sqlite3_errmsg(mDatabase));
            }
            sqlite3_close(mDatabase);
        }
        else {
            DEBUGLOG(KFailedToCreateDBFile);
        }
    }

Внешний ключ Pragma включен, но я создал две таблицы, как показано ниже, с запросами на создание, включая ON DELETE CASCADE // Первая таблица Создать запрос

   @"CREATE TABLE IF NOT EXISTS Session (sessionAppID INTEGER PRIMARY KEY  NOT NULL , sessionID VARCHAR(255) NOT NULL, userAppID INTEGER, deviceAppID INTEGER NOT NULL, sessionStartTime VARCHAR(255) NOT NULL, sessionEndTime VARCHAR(255), sessionCreatedDateTime VARCHAR(200) NOT NULL,sessionUpdatedDateTime VARCHAR(200) NOT NULL, sessionFailureCount INTEGER NOT NULL,sessionStatus INTEGER NOT NULL, FOREIGN KEY(userAppID) REFERENCES User(userAppID), FOREIGN KEY(deviceAppID) REFERENCES Device(deviceAppID))"

//Вторая таблица, которая является дочерней для запроса первой таблицы

 @"CREATE TABLE IF NOT EXISTS EventLog (eventLogAppID INTEGER PRIMARY KEY  NOT NULL , eventGUID VARCHAR(255) NOT NULL, sessionAppID INTEGER NOT NULL , eventName VARCHAR(255) NOT NULL, eventGroupGUID VARCHAR(255), eventParentGUID VARCHAR(255), eventCategory INTEGER NOT NULL,eventStartTime VARCHAR(255) NOT NULL, eventEndTime VARCHAR(255) ,eventDuration VARCHAR(255),eventType INTEGER NOT NULL,eventCreatedDateTime VARCHAR(200) NOT NULL,eventUpdatedDateTime VARCHAR(200) NOT NULL,eventFailureCount INTEGER NOT NULL,eventStatus INTEGER NOT NULL, FOREIGN KEY(sessionAppID) REFERENCES Session(sessionAppID)ON DELETE CASCADE)"

При удалении записи сеанса удаляется только запись сеанса. Записи журнала событий не удаляются. Может ли кто-нибудь помочь в этом, в чем будет проблема. Кстати, я использую sqlite3 версии 3.7.1.


person Karthik Mitta    schedule 25.11.2013    source источник


Ответы (2)


См. http://www.sqlite.org/foreignkeys.html#fk_enable. Обратите внимание, что вам необходимо включить внешние ключи для каждого соединения.

Предположительно, вы создаете новое соединение для выполнения запроса delete. Обновите свой код, чтобы каждый раз, когда вы открываете соединение с базой данных, вы устанавливали прагму по мере необходимости.

person rmaddy    schedule 25.11.2013
comment
Спасибо за вашу большую помощь, это работает. Если бы я заменил эту разрешающую часть, чтобы удалить запрос только в определенном классе. Но я хочу узнать кое-что еще, например, я мало знаю о других технологиях, которые я видел в Android, они просто включают внешние ключи при создании базы данных, устанавливая, как этот public void setForeignKeyConstraintsEnabled (логическое включение), и если я также открою плагин firefox в настройках БД есть только эта опция включения, но почему в IOS, даже если это тот же sqlite, зачем нужно включать при конкретном запросе. - person Karthik Mitta; 26.11.2013

Я использовал одноэлементный экземпляр SQLiteAsyncConnection в Xamarin.Forms, но в любом случае мне пришлось вызывать «PRAGMA Foreign_keys = ON;» перед каждым вызовом метода DeleteAsync. Вызов его один раз после открытия соединения у меня не сработал. Подводя итог тому, что @rmaddy и @Karthik Mitta пытались сказать вместе

person Brcinho    schedule 14.03.2020