2010-08-20 3 views
0

Может кто-нибудь, пожалуйста, помогите мне с этой проблемой. Чтобы сохранить значения в моем приложении iPhone, я использую SQLite3. У меня много дубликатов значений в моей базе данных. Итак, чтобы исключить, что я планирую написать какое-то уникальное ограничение для таблицы. Мое ограничение должно быть таким, чтобы контакт, чье имя, фамилия и адрес электронной почты были такими же, я хочу игнорировать это.УНИКАЛЬНОЕ ограничение в SQLite

Когда я попытался реализовать уникальное ограничение в определении моего таблицы, он дает мне ошибку. Я попробовал это, проверив синтаксис в sqlite.org. Пожалуйста, см. Мой метод создания таблицы и, пожалуйста, помогите мне. Если у вас есть лучшее решение, сообщите мне. Я буду рад предоставить вам любую информацию, если потребуется.

У меня есть 36 полей в моей базе данных, где поле3 является первым, поле4 является фамилией, а поле 31 - это электронная почта. Также, пожалуйста, дайте мне знать, следует ли использовать это ограничение при вставке или выборе строк. Я буду ждать ваших ответов. Спасибо!

Ошибка в этом методе: ожидается: до (лексем я пытался во многих отношениях, но это не сработало

-(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

Bill .. спасибо за ответ. Я использую SQLite3. Он отлично работает для меня. Я могу создать таблицу и вставить значения. Проблема возникает, когда я пытаюсь создать некоторые ограничения для таблицы. – racharambola

+0

Он говорит, что проблема заключается в объявлении функции, какой она есть. Уникальное не является допустимым ключевым словом в объявлениях объектной-функции, заставляя эту последнюю часть испортить ваш компилятор. Проблема НЕ в вашем заявлении sql. Это приведет к ошибке во время выполнения. –

0

я смог использовать 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]; 
} 

и после пожара Вставка запроса следующим способом, используя ключевое слово 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]; 


}