2016-07-04 8 views
0

私はiOS用のsqliteを作っています。私はデータを保存して表示に成功しましたが、削除はできませんでした。 これは私のCreateTableメソッドです:これは私のSaveDataをする方法であるiOSのsqlite削除メソッドで何が問題になっていますか?

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

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

これは動作していない私のdeleteData方法、次のとおりです。

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

それを返すには、削除に失敗しました。 。

+0

'filePath'の出力は? – fuzz

+0

[self filePath]はdocumentsDirectory/db.sqlを返します –

+1

'stringWithFormat:'でクエリを作成しません。準備されたステートメントに値を正しくバインドする。 – rmaddy

答えて

0

single quoteをクエリのニックネームの間に入れる必要があると思います。その中にスペースが含まれているとレコードを削除しないためです。このようなdelete文を変更してください。

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

ニックネームに '' '文字が含まれていると、これは失敗します。 'stringWithFormat:'でクエリを構築しないでください。準備されたステートメントに値を適切にバインドします。 – rmaddy

関連する問題