2013-11-25 69 views
3

sqlite3的我在IOS創建.sqlite文件編程像下面通過啓用編譯foreignkeys ONON DELETE CASCADE不工作是在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); 
     } 
    } 

語用外鍵實現,但是,我創建了兩個表如下圖所示與包括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)" 

在刪除會話記錄,只有會話記錄被刪除事件日誌記錄不被刪除,可以在任何一個,請在此幫助,會是怎樣的problem.By我使用的sqlite3版本的方式3.7.1

回答

5

http://www.sqlite.org/foreignkeys.html#fk_enable。請注意,您需要爲每個連接啓用外鍵。

假設您正在創建一個新連接來執行delete查詢。每次打開數據庫連接時更新你的代碼,你可以根據需要設置編譯指示。

+0

感謝您的大力幫助,它的工作原理如果我將該啓用部分替換爲僅刪除特定類中的查詢。但我想知道更多的東西,我不太瞭解我在android中看到的其他技術,他們只是在創建數據庫時通過設置像public void setForeignKeyConstraintsEnabled(boolean enable)來啓用外鍵,如果我也打開Firefox插件在數據庫設置中,只有啓用選項會在那裏,但爲什麼在IOS中,儘管它的相同的SQLite爲什麼需要在特定的查詢中啓用。 –