2012-01-27 4 views
1

Я пытаюсь добавить 3 части данных в базу данных SQLite3. С помощью учебника я почти там. Ниже мой код.Добавление данных в SQLite3 DB изнутри Xcode

Я получаю то, что ожидаю от NSLogs. Я нахожу DB без проблем, я скомпилирую инструкцию для отправки в БД без проблем, но когда приложение доходит до sqlite3_prepare_v2(database, sqlstatement, -1, &compliedstatement, NULL)==SQLITE_OK, я ожидаю, что данные будут добавлены в DB, но это не так, и я также ожидаю для отображения UIAlertView, чтобы сообщить пользователю ERROR os SUCCESS. Надеюсь, ты увидишь, чего я не вижу.

Этот NSLog возвращает свойства текста, как ожидалось.

- (IBAction)hide:(id)sender { 
    [name resignFirstResponder]; 
    [age resignFirstResponder]; 
    [color resignFirstResponder]; 

} 



- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    DBName = @"mydatabase.sqlite"; 
    NSArray *documentsPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [documentsPaths objectAtIndex:0]; 
    DBPath = [documentsDir stringByAppendingPathComponent:DBName]; 

} 


-(void)checkAndCreateDB { 
    BOOL Success; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    Success = [fileManager fileExistsAtPath:DBPath]; 

    if(Success) { 
     NSLog(@"DB Found");  
     return; 
    } 

    NSLog(@"DB Not Found"); 
    NSString *databasePathFromApp = [[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:DBName]; 
    [fileManager copyItemAtPath:databasePathFromApp toPath:DBPath error:nil]; 

} 

Этого NSLog возвращает

-(void)insertData Name:(NSString*)n Age:(NSString*)a Color:(NSString*)c { 
    [self checkAndCreateDB]; 
    sqlite3 *database; 
    if (sqlite3_open([DBPath UTF8String],&database)==SQLITE_OK) { 
     NSString *statement; 
     sqlite3_stmt *compliedstatement; 
     statement = [[NSString alloc] initWithFormat:@"insert into table1 values ('%@', '%@', '%@')",n,a,c]; 
     const char *sqlstatement = [statement UTF8String]; 
     NSLog(@"%@",statement); 

     if (sqlite3_prepare_v2(database, sqlstatement, -1, &compliedstatement, NULL)==SQLITE_OK) { 

     if (SQLITE_DONE!=sqlite3_step(compliedstatement)) { 
      NSAssert1(0, @"Error by inserting '%s'", sqlite3_errmsg(database)); 
      UIAlertView *AlertOK = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"Error by inserting" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];  

      [AlertOK show]; 

     } 
     else { 
      UIAlertView *AlertOK = [[UIAlertView alloc] initWithTitle:@"Success!" message:@"Data successfully inserted" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];    
      [AlertOK show]; 
      } 
     } 
     sqlite3_finalize(compliedstatement); 

    } 
    sqlite3_close(database); 

} 

И последняя NSLog выше дисплеев insert into table1 values ('n', 'a', 'c'), как я бы ожидать.

Что-то происходит неправильно при вставке, и я не могу понять это.

FYI БД была создана с использованием SQLiteManager. SS ниже:

SQLiteManager table1 SS

+0

Можете ли вы быть более точным, что именно произошло? Вы подготовили заявление, но с какой ошибкой вы сталкиваетесь? было ли это (SQLITE_DONE! = sqlite3_step (compliedstatement)) выполнено? Вот что случилось потом? – Byte

+0

Я получаю Успех 'UIAlertView', но когда я открываю свою базу данных в SQLiteManager и' select * from table1', есть 0 записей. –

ответ

1

Ok, Вы работаете на тренажере или чтения компакт-дисков? В iDevice вы не можете создать внешнюю базу данных SQL (по крайней мере, насколько мне известно). Вы должны создать его динамически из-за песочницы. «FYI DB был создан с использованием SQLiteManager». Проверьте это.

Если это не было проблемой попробуйте изменить свой код от "подготовить ...", чтобы "выполнить"

От ...

if (sqlite3_prepare_v2(database, sqlstatement, -1, &compliedstatement, NULL)==SQLITE_OK) { 

    if (SQLITE_DONE!=sqlite3_step(compliedstatement)) { 
     NSAssert1(0, @"Error by inserting '%s'", sqlite3_errmsg(database)); 
     UIAlertView *AlertOK = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"Error by inserting" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];  

     [AlertOK show]; 

    } 
    else { 
     UIAlertView *AlertOK = [[UIAlertView alloc] initWithTitle:@"Success!" message:@"Data successfully inserted" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];    
     [AlertOK show]; 
     } 
    } 
    sqlite3_finalize(compliedstatement); 

К ...

sqlite3_exec(database, [sqlstatement UTF8String], NULL, NULL, &error); 

Сделайте запись в журнале «error», потому что это очень важно.

если вы хотите поп UIAlert сделать это

if (error !=nil) 
    //show alert for error 
else 
    //show alert for success 
+0

Отличный ответ, это указывало мне в правильном направлении. Благодаря! –