2010-08-20 9 views
0

Quelqu'un peut-il s'il vous plaît m'aider avec ce problème.Pour enregistrer les valeurs dans mon application iPhone, j'utilise SQLite3. J'ai beaucoup de valeurs en double dans ma base de données. Donc, pour éliminer cela, je prévois d'écrire une contrainte unique sur la table. Ma contrainte devrait être telle qu'un contact dont le prénom, le nom et le courriel sont les mêmes, je veux l'ignorer.Contrainte UNIQUE dans SQLite

Lorsque j'ai essayé d'implémenter la contrainte unique dans ma définition de table, cela me donne une erreur. J'ai essayé ceci en vérifiant la syntaxe dans sqlite.org. S'il vous plaît voir ma méthode de création de table et s'il vous plaît aidez-moi. Si vous avez une meilleure solution, faites-le moi savoir. Je serai heureux de vous fournir des informations si nécessaire.

J'ai dans ma base de données 36 champs où champ3 est le prénom, champ4 le nom de famille et champ31 est le courrier électronique. Aussi, s'il vous plaît laissez-moi savoir si nous devrions utiliser cette contrainte lors de l'insertion ou la sélection des lignes. J'attendrai vos réponses. Merci!

L'erreur dans cette méthode est: Estimé: avant (jeton J'ai essayé à bien des égards, mais cela n'a pas

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

Répondre

0

Ne placez pas les noms de nom de la table ou de la colonne unique. En SQL, les guillemets simples sont pour les littéraux de chaîne et les littéraux de date

Vous devez utiliser des guillemets doubles pour délimiter les identificateurs tels que les noms de table et les noms de colonnes, car il s'agit d'une chaîne entre guillemets dans votre code d'application. , vous devrez peut-être échapper ces guillemets doubles .Par exemple:

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

En regardant de plus près, je vois votre problème ne peut pas être dans SQL mais en Objective-C:

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

Serait-ce le ( suivant UNIQUE dans vos déclarations de méthode est celui qui cause l'erreur? Je n'ai jamais programmé en Objective-C, mais cela semble hors de propos.

+0

Bill .. merci pour la réponse .. J'utilise SQLite3..Il fonctionne bien pour moi .. Je peux créer la table et insérer les valeurs. Le problème vient quand j'essaye de créer des contraintes pour la table – racharambola

+0

Il dit que le problème est dans votre déclaration de fonction, ce qu'elle est. Unique n'est pas un mot-clé valide dans les déclarations de fonction d'objectif-c, rendant cette dernière partie bousiller votre compilation. Le problème n'est pas dans votre instruction SQL. Cela causerait seulement une erreur pendant l'exécution. –

0

-je capable d'utiliser la requête avec succès UNIQUE Essayez de manière suivante: Créer le tableau suivant ainsi:

-(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]; 
} 

et après le feu Insérer une requête en utilisant suivante façon IGNORE mot-clé

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


}