2016-07-04 8 views
0

Ich mache eine SQLite für iOS. Es ist mir gelungen, Daten zu speichern und zu präsentieren, aber nicht zu löschen. Das ist meine Methode Create:Was ist los mit meiner iOS sqlite delete-Methode?

- (void) createTable: (NSString *) tableName 
      withField1: (NSString *) field1 
      withField2: (NSString *) field2 
      withField3: (NSString *) field3 
      withField4: (NSString *) field4{ 
    char *err; 
    NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ('%@' " 
        "TEXT PRIMARY KEY, '%@' TEXT, '%@' TEXT, '%@' TEXT);", tableName, field1,field2,field3,field4]; 

    if(sqlite3_exec(db,[sql UTF8String], NULL,NULL, &err) != SQLITE_OK) { 
     sqlite3_close(db); 
     NSAssert(0, @"Could not create table"); 
    } else { 
     NSLog(@"table created"); 
    } 
} 

Das ist mein speichereDaten Methode:

-(void) saveNewData :(NSString*)nickname :(NSString*)url :(NSString*)uid :(NSString*)pswd{ 


    sqlite3_stmt *statement; 

    if (sqlite3_open([[self filePath] UTF8String], &db) == SQLITE_OK) { 
     NSString *sql =[NSString stringWithFormat:@"INSERT INTO accountListDB ('nickname', 'url', 'uid', 'pswd') VALUES ('%@', '%@', '%@', '%@')", nickname, url, uid, pswd]; 

     const char *insert_stmt = [sql UTF8String]; 
     sqlite3_prepare_v2(db, insert_stmt, -1, &statement, NULL); 

     if (sqlite3_step(statement) == SQLITE_DONE) { 
      NSLog(@"data added"); 
     }else{ 
      NSLog(@"failed to added"); 
     } 
     sqlite3_finalize(statement); 
     sqlite3_close(db); 
    } 
} 

Das ist mein deleteData Verfahren, das nicht funktioniert:

-(void) deleteData:(NSString*)nickname :(NSString*)url :(NSString*)uid :(NSString*)pswd{ 
    sqlite3_stmt *statement; 

    if (sqlite3_open([[self filePath] UTF8String], &db) == SQLITE_OK) { 
     NSString *sql =[NSString stringWithFormat:@"DELETE FROM accountListDB WHERE nickname = %@", nickname]; 

     const char *delete_stmt = [sql UTF8String]; 
     sqlite3_prepare_v2(db, delete_stmt, -1, &statement, NULL); 

     if (sqlite3_step(statement) == SQLITE_DONE) { 
      NSLog(@"data deleted"); 
     }else{ 
      NSLog(@"failed to delete"); 
     } 
     sqlite3_finalize(statement); 
     sqlite3_close(db); 
    } 
} 

Er scheiterte kehrt zu löschen .

+0

Was ist die Ausgabe von 'filePath'? – fuzz

+0

[self filePath] gibt Dokumente zurückDirectory/db.sql –

+1

Erstellen Sie keine Abfragen mit 'stringWithFormat:'. Binden Sie Werte ordnungsgemäß in die vorbereitete Anweisung ein. – rmaddy

Antwort

0

Ich denke, Sie müssen single quote zwischen Ihrem nickename in der Abfrage setzen, denn wenn es Speicherplatz innerhalb enthält, wird es die Datensätze nicht löschen. Ändern Sie Ihre Löschanweisung wie folgt

NSString *sql = [NSString stringWithFormat:@"DELETE FROM accountListDB WHERE nickname = '%@'", nickname]; 
+4

Dies schlägt fehl, wenn der Kurzname ein '' '- Zeichen enthält. Erstellen Sie keine Abfragen mit 'stringWithFormat:'. Binden Sie den Wert ordnungsgemäß in die vorbereitete Anweisung ein. – rmaddy