Инструкция SQLite insert не вставляет новые данные

#objective-c

#objective-c

Вопрос:

Инструкция SQLite insert не вставляет новые данные

я использую этот код

 - (void) addN: (number *) theN
{
    const char *sql = "insert into table (valueN) Values(?)";
    sqlite3_stmt *addStmt = nil;
    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
        NSString * docsDir = [paths objectAtIndex:0];
        NSString * thePath = [docsDir stringByAppendingPathComponent: @"theDB.sqlite"];
        sqlite3_open([thePath UTF8String], amp;database);
        sqlite3_prepare_v2(database, sql, -1, amp;addStmt, NULL);
        sqlite3_bind_int(addStmt, 1, theN.theNumber);
        sqlite3_step(addStmt);
        sqlite3_finalize(addStmt);
        sqlite3_close(database);
    }
  

и метод для вставки записи

 - (IBAction) saveN: (id) sender
{
    numbers *theNumbers = [[numbers alloc] init];
    number *theNumber = [[number alloc] init];
    theNumber.theNumber = newN;
    [theNumbers addN:theNumber];
    [theNumbers release];
    [theNumber release];
}
  

код выполняется, но в базу данных не вставляется запись.
может кто-нибудь, пожалуйста, указать мне, где ошибка — потому что там, очевидно, ошибка 🙂

Комментарии:

1. У меня нет ответа на ваш вопрос, но когда я вижу все усилия, которые приходится затрачивать на простую вставку строки в базу данных — я понимаю, почему я использую core data!

2. Ваша первая проблема заключается в том, что вы не проверяете какие-либо коды возврата. У вас могут быть ошибки справа и слева, и вы не знаете об этом.

Ответ №1:

Вы не проверяете возвращаемые значения ни одного из вызовов sqlite3. Есть большая вероятность, что один из них выходит из строя.

Ответ №2:

этот код, похоже, работает:

 - (void) addN: (number *) theN
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *thePath = [[[NSBundle mainBundle] resourcePath]
                           stringByAppendingPathComponent:@"theDB.sqlite"];
    BOOL success = [fileManager fileExistsAtPath:thePath];
    if (!success)
    {
        NSLog(@"Failed to find database file '%@'.", thePath);
    }
    if (!(sqlite3_open([thePath UTF8String], amp;database) == SQLITE_OK))
    {
        NSLog(@"An error opening database, normally handle error here.");
    }
    const char *sql = "insert into table (valueN) Values(?)";
    sqlite3_stmt *addStmt = nil;
    if (sqlite3_prepare_v2(database, sql, -1, amp;addStmt, NULL) != SQLITE_OK)
    {
        NSLog(@"Error, failed to prepare statement, normally handle error here.");
    }
    sqlite3_bind_int(addStmt, 1, theN.theNumber);
    sqlite3_step(addStmt);
    if(sqlite3_finalize(addStmt) != SQLITE_OK)
    {
        NSLog(@"Failed to finalize data statement, normally error handling here.");
    }
    if (sqlite3_close(database) != SQLITE_OK)
    {
        NSLog(@"Failed to close database, normally error handling here.");
    }
}