Objective c SQLite中的唯一约束

Objective c SQLite中的唯一约束,objective-c,iphone,database,sqlite,constraints,Objective C,Iphone,Database,Sqlite,Constraints,有人能帮我解决这个问题吗?为了在我的iPhone应用程序中保存值,我正在使用SQLite3。我的数据库中有许多重复的值。因此,为了消除这种情况,我计划在表上编写一些独特的约束。我的限制应该是这样一种方式,一个联系人的名字、姓氏和电子邮件是相同的,我想忽略这一点 当我试图在表定义中实现唯一约束时,它给了我一个错误。我通过检查sqlite.org中的语法尝试了这一点。请参阅我的表格创建方法,并请帮助我。如果你有更好的解决方案,请告诉我。如果需要的话,我很乐意为您提供任何信息 我的数据库中有36个字段

有人能帮我解决这个问题吗?为了在我的iPhone应用程序中保存值,我正在使用SQLite3。我的数据库中有许多重复的值。因此,为了消除这种情况,我计划在表上编写一些独特的约束。我的限制应该是这样一种方式,一个联系人的名字、姓氏和电子邮件是相同的,我想忽略这一点

当我试图在表定义中实现唯一约束时,它给了我一个错误。我通过检查sqlite.org中的语法尝试了这一点。请参阅我的表格创建方法,并请帮助我。如果你有更好的解决方案,请告诉我。如果需要的话,我很乐意为您提供任何信息

我的数据库中有36个字段,其中field3是firstname,field4是lastname,field31是email。另外,请告诉我在插入或选择行时是否应该使用此约束。我将等待您的回复…谢谢

此方法中的错误是:Expected:before(token我尝试了很多方法,但都没有成功

-(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");
}

不要将表名或列名括在单引号中。在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中编程,但这看起来不合适。

我能够成功使用UNIQUE查询 尝试以下方法: 按以下方式创建表:

-(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];
}
并在fire之后使用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];


}

比尔..谢谢你的回答..我在使用SQLite3..它对我来说很好..我可以创建表并插入值。当我试图为表创建一些约束时,问题来了他说问题出在你的函数声明中,它是唯一的。在objective-c函数声明中,Unique不是有效的关键字,这是最后一个部分错误导致编译失败。问题不在sql语句中。这只会在运行时导致错误。