2013-07-09 3 views
-1

Я пытаюсь вставить значения. Но значения не сохраняются. Это мой код.i alredy создал базу данных с помощью SQL-менеджера. Это имя базы данных «feedback.sqlite». Если я запустил код, ошибки не будут отображаться. Но если я введу данные, то нажмите кнопку «Сохранить», данные не будут сохранены. Если я запустил код «Не удалось открыть/создать базу данных», сообщение появится на симуляторе. я не могу догадаться, где ошибка. Пожалуйста, дайте мне идею. Спасибо заранее.Как вставить значения с помощью sqlite в iphone

Ratingviewcontroller.h

@interface RatingViewController : UIViewController <UITextFieldDelegate> { 

    sqlite3 *contactDB; 

    IBOutlet UITextField *Traineeid; 
    IBOutlet UITextField *Trainername; 
    IBOutlet UITextField *Traineename; 
    IBOutlet UITextField *Rating; 
    IBOutlet UILabel *status; 

    NSString *dbpath; 
} 

@property(nonatomic, retain) UITextField *Traineeid; 
@property(nonatomic, retain) UITextField *Trainername; 
@property(nonatomic, retain) UITextField *Traineename; 
@property(nonatomic, retain) UITextField *Rating; 
@property(nonatomic, retain) UILabel *status; 

- (IBAction)saveData:(id)sender; 
- (IBAction)findData:(id)sender; 

@end 

Ratingviewcontroller.m

@implementation RatingViewController 
- (void)viewDidLoad { 

    // Do any additional setup after loading the view, typically from a nib. 

    NSString *docsDir; 
    NSArray *dirPaths; 

    // get the document directory 

    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, 
                NSUserDomainMask, YES); 

    docsDir = [dirPaths objectAtIndex:0]; 

    // Build the path to the database file 

    dbpath = [[NSString alloc] initWithString: 
      [docsDir stringByAppendingPathComponent:@"feedback.sqlite"]]; 
    NSFileManager *filemgr = [NSFileManager defaultManager]; 

    if ([filemgr fileExistsAtPath:dbpath] == NO) { 

     const char *db = [dbpath UTF8String]; 

     if (sqlite3_open(db, &contactDB) == SQLITE_OK) { 

      char *errMsg; 
      const char *sql_stmt = 
       "CREATE TABLE IF NOT EXISTS CONTACTS (Traineeid INTEGER " 
       "PRIMARY KEY AUTOINCREMENT, Trainername TEXT, Traineename " 
       "TEXT, Rating float)"; 

      if (sqlite3_exec(contactDB, sql_stmt, NULL, NULL, &errMsg) != 
       SQLITE_OK) { 

       status.text = @"Failed to create table"; 
      } 

      sqlite3_close(contactDB); 

     } else { 

      status.text = @"Failed to open/create database"; 
     } 
    } 

    [super viewDidLoad]; 
} 

- (void)saveData:(id)sender { 

    sqlite3_stmt *statement; 
    const char *database = [dbpath UTF8String]; 

    if (sqlite3_open(database, &contactDB) == SQLITE_OK) { 

     NSString *insertSQL = 
      [NSString stringWithFormat: 
        @"INSERT INTO CONTACTS (Trainee id, Trainer name, Trainee " 
        "name,Rating) VALUES (\"%@\",\"%@\", \"%@\", \"%@\")", 
       Traineeid, Trainername.text, Trainername.text, Rating.text]; 

     /* NSString *insertSQL = [NSString stringWithFormat:@"insert into 
             CONTACTS 
      (Traineeid,Trainername,Traineename,Rating) values 
             (\"%d\",\"%@\", \"%@\", 
      \"%f\")",[Traineeid integerValue], 
             Trainername, Traineename,[Rating 
      float]];*/ 

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

     if (sqlite3_step(statement) == SQLITE_DONE) { 

      status.text = @"Contact added"; 
      Traineeid.text = @""; 
      Trainername.text = @""; 
      Traineename.text = @""; 
      Rating.text = @""; 

     } else { 

      status.text = @"Failed to add contact"; 
     } 

     sqlite3_finalize(statement); 

     sqlite3_close(contactDB); 
    } 
} 

- (void)findContact { 

    const char *datapath = [dbpath UTF8String]; 
    sqlite3_stmt *statement; 

    if (sqlite3_open(datapath, &contactDB) == SQLITE_OK) { 

     NSString *querySQL = [NSString stringWithFormat: 
            @"select Trainer name,Trainee name,Rating " 
            "from CONTACT where Traineeid=\"%@\"", 
           Traineeid]; 

     const char *query_stmt = [querySQL UTF8String]; 

     if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == 
      SQLITE_OK) { 

      if (sqlite3_step(statement) == SQLITE_ROW) { 

       NSString *trainid = [[NSString alloc] initWithUTF8String: 
         (const char *)sqlite3_column_text(statement, 0)]; 

       Traineeid.text = trainid; 

       NSString *trainernme = [[NSString alloc] initWithUTF8String: 
         (const char *)sqlite3_column_text(statement, 1)]; 

       Trainername.text = trainernme; 

       NSString *traineenme = [[NSString alloc] initWithUTF8String: 
         (const char *)sqlite3_column_text(statement, 2)]; 

       Traineename.text = traineenme; 

       NSString *rat = [[NSString alloc] initWithUTF8String: 
         (const char *)sqlite3_column_text(statement, 3)]; 

       Rating.text = rat; 
       status.text = @"Match found"; 

      } else { 

       status.text = @"Match not found"; 
       Traineeid.text = @""; 
       Trainername.text = @""; 
       Traineename.text = @""; 
       Rating.text = @""; 
      } 

      sqlite3_finalize(statement); 
     } 

     sqlite3_close(contactDB); 
    } 
} 

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 

    [textField resignFirstResponder]; 
    return YES; 
} 
@end 
+3

Отличное форматирование! Во всяком случае, я не смотрел код, но я уверен, вы не используете 'sqlite3_errmsg()' вы? Он должен сказать вам, что пошло не так. – trojanfoe

+0

Если существует база данных, создающая таблицу, условие кажется ложным, если ([filemgr fileExistsAtPath: dbpath] == NO) try if ([filemgr fileExistsAtPath: dbpath]) – Hanuman

+0

Не связано с вашей жалобой, но Google «SQL-инъекция», чтобы увидеть почему вы не должны вставлять значения данных в строку SQL. (Простое использование подготовленных операторов недостаточно, если вы вставляете значения данных в операторы и используете замену значений.) –

ответ

-1

попробуйте этот код, а также вы уже создали базу данных с помощью SQLite manager.Thats почему нет необходимости создавать вставьте значения.

- (void)viewDidLoad { 
    if ([filemgr fileExistsAtPath:dbpath]) { 

     const char *db = [dbpath UTF8String]; 

     if (sqlite3_open(db, &contactDB) == SQLITE_OK) { 

      char *errMsg; 

      const char *sql_stmt = 
       "CREATE TABLE IF NOT EXISTS CONTACTS (Traineeid INTEGER " 
       "PRIMARY KEY AUTOINCREMENT, Trainername TEXT, Traineename " 
       "TEXT, Rating float)"; 

      if (sqlite3_exec(contactDB, sql_stmt, NULL, NULL, &errMsg) != 
       SQLITE_OK) { 

       status.text = @"Failed to create table"; 
      } 

      sqlite3_close(contactDB); 

     } else { 

      status.text = @"Failed to open/create database"; 
     } 
    } 

    [super viewDidLoad]; 
}