Добавление данных в базу данных SQLite3 из Xcode - PullRequest
1 голос
/ 27 января 2012

Я пытаюсь добавить 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 Ответ

1 голос
/ 30 января 2012

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

Если проблема не в этом, попробуйте изменить код с «prepare ...» на «execute»

С ...

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
...