Добавление данных в базу данных SQLite3 из Xcode

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

Я получаю то, что я ожидаю от NSLogs, Я нахожу БД без проблем, я компилирую инструкцию для отправки на БД без проблем, но когда приложение попадает в sqlite3_prepare_v2(database, sqlstatement, -1, &compliedstatement, NULL)==SQLITE_OK Я ожидаю, что данные будут добавлены в DB, но это не так, и я также ожидаю, чтобы отобразить UIAlertView сообщить пользователю ОШИБКА ОС УСПЕХА. Я надеюсь, что вы можете видеть то, что я не делаю.

- (IBAction)addData:(id)sender {
    NSString *n = [[NSString alloc] initWithString:[name text]];
    NSString *a = [[NSString alloc] initWithString:[age text]];
    NSString *c = [[NSString alloc] initWithString:[color text]];
    NSLog(@"%@ - %@ - %@",n,a,c);
    [self insertDataName:n Age:a Color:c];
}

это 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 возвращается DB Found

-(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') как я и ожидал.

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

К вашему сведению, БД была создана с использованием SQLiteManager. СС ниже:

SQLiteManager table1 SS

1 ответ

Решение

Хорошо, вы работаете на симуляторе или iDevice? В iDevice вы не можете создать внешнюю базу данных SQL (по крайней мере, насколько мне известно). Вы должны создать его динамически из-за песочницы. "К вашему сведению, БД была создана с использованием 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);

Сделайте вход в систему "ошибка", потому что это очень важно.

если вы хотите получить UIAlert, сделайте это

 if (error !=nil)
    //show alert for error
 else
    //show alert for success
Другие вопросы по тегам