2010-08-20 202 views
0

有人可以幫我解決這個問題。爲了將值保存在我的iPhone應用程序中,我使用了SQLite3。我的數據庫中有很多重複的值。所以,爲了消除這個問題,我打算在表上寫一些獨特的約束。我的約束應該是這樣一種方式,即名字,姓氏和電子郵件相同的聯繫人,我想忽略它。SQLite中的唯一約束

當我試圖在我的表定義中實現唯一約束時,它給我一個錯誤。我通過檢查sqlite.org中的語法來嘗試這一點。請參閱我的表格創建方法,並請幫助我。如果你有更好的解決方案,請告訴我。如果需要,我會很高興爲您提供任何信息。

我在我的數據庫中有36個字段,其中field3是firstname,field4是lastname,field31是電子郵件。另外,請讓我知道如果我們應該在插入或選擇行時使用此約束。我會等你的回覆..謝謝!

此方法中的錯誤:預期:前(令牌我試過很多方法,但它沒有工作

-(void) createTableNamed:(NSString *) tableName withField1:(NSString *) field1 withField2:(NSString *) field2 withField3:(NSString *) field3 withField4:(NSString *) field4 
    withField5:(NSString *) field5 withField6:(NSString *) field6 withField7:(NSString *) field7 withField8:(NSString *) field8 withField9:(NSString *) field9 
    withField10:(NSString *) field10 withField11:(NSString *) field11 withField12:(NSString *) field12 withField13:(NSString *) field13 withField14:(NSString *) field14 
    withField15:(NSString *) field15 withField16:(NSString *) field16 withField17:(NSString *) field17 withField18:(NSString *) field18 withField19:(NSString *) field19 
    withField20:(NSString *) field20 withField21:(NSString *) field21 withField22:(NSString *) field22 withField23:(NSString *) field23 withField24:(NSString *) field24 
    withField25:(NSString *) field25 withField26:(NSString *) field26 withField27:(NSString *) field27 withField28:(NSString *) field28 withField29:(NSString *) field29 
    withField30:(NSString *) field30 withField31:(NSString *) field31 withField32:(NSString *) field32 withField33:(NSString *) field33 withField34:(NSString *) field34 
    withField35:(NSString *) field35 withField36:(NSString *) field36 UNIQUE(field3,field4,field31){ 
char *err; 
NSString *sql = [NSString stringWithFormat: 
     @"CREATE TABLE IF NOT EXISTS '%@' ('%@' TEXT PRIMARY KEY, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT,UNIQUE('%@' TEXT,'%@' TEXT,'%@' TEXT));", tableName, field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16, field17, field18, field19, field20, field21, field22, field23, field24, field25, field26, field27, field28, field29, field30, field31, field32, field33, field34, field35, field36,field3,field4,field31]; 
if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) { 
    sqlite3_close(db); 
    NSAssert(0, @"Tabled failed to create."); 
} 
NSLog(@"Good job"); 
} 

回答

0

不括在單表名或列名。在SQL中,單引號用於字符串文字和日期文字

您應該使用雙引號來分隔標識符,例如表名和列名稱,因爲這是在應用程序代碼中的雙引號字符串中,您可能不得不使用這些雙引號。例如:

NSString *sql = [NSString stringWithFormat: 
     @"CREATE TABLE IF NOT EXISTS \"%@\" (\"%@\" TEXT PRIMARY KEY ... 

仔細看,我看到你的問題可能無法在SQL,但在Objective-C:

withField36:(NSString *) field36 UNIQUE(field3,field4,field31){ 

難道是(按照您的方法聲明UNIQUE是一個引起錯誤?我從來沒有在Objective-C中編程,但這看起來不合適。

+0

比爾以下方式發生火災後插入查詢..感謝您的答覆..我正在使用SQLite3 ..它適用於我..我可以創建表並插入值。當我試圖爲表格創建一些約束時,問題就出現了。 – racharambola 2010-08-20 15:12:00

+0

他說問題出現在函數聲明中。唯一不是Objective-c函數聲明中的有效關鍵字,使最後一部分搞砸了你的編譯。這個問題不在你的sql語句中。這隻會在運行時造成錯誤。 – 2010-08-20 18:48:54

0

我能使用的唯一查詢成功 嘗試以下方法: 創建表方式如下:

-(void) createFavouriteTable:(NSString *) field1 withField2:(NSString *) field2 withField3:(NSString *) field3 withField4:(NSString *) field4 withField5:(NSString *) field5 

{ 

char *err; 
NSString *sql = [NSString stringWithFormat: 
       @"CREATE TABLE IF NOT EXISTS 'Favourite' ('%@' INTEGER PRIMARY KEY,'%@' TEXT, '%@' TEXT, '%@' TEXT, '%@' TEXT,UNIQUE('%@'));", 
       field1, field2, field3,field4, field5,field2]; 
} 

,並在用ignore關鍵字

-(void) insertRecordIntoFavouriteTable:(NSString *) tableName 
         withField1: (NSString *) field1 field1Value: (int) field1Value 
         withField2: (NSString *) field2 field2Value: (NSString *) field2Value 
         withField3: (NSString *) field3 field3Value: (NSString *) field3Value 
         withField4: (NSString *) field4 field4Value: (NSString *) field4Value 
         andField5: (NSString *) field5 field5Value: (NSString *) field5Value { 


NSString *sql = [NSString stringWithFormat: 
       @"INSERT OR IGNORE INTO '%@' ('%@', '%@', '%@', '%@') VALUES ('%@','%@', '%@', '%@')", 
       tableName, field2, field3, field4, field5, field2Value, field3Value, field4Value, field5Value]; 


}