Сбой sqlite3 для второго оператора вставки - PullRequest
1 голос
/ 26 мая 2010

Мое приложение падает на операторе (sqlite3_step(insertAlert) == SQLITE_DONE) при выполнении для i = 1. Кто-нибудь может сказать мне, почему это происходит?

sqlite3_stmt *insertAlert;

textmeAppDelegate *textme = (textmeAppDelegate *)[[UIApplication sharedApplication] delegate];

NSString *insert = @"INSERT INTO alerts (alert_id, email_address, messege_text, when_to_send, how_often_send, recipient_phone_number) VALUES(?, ?, ?, ?, ?, ?)";
if(sqlite3_prepare_v2(textme.dbConn, [insert UTF8String], -1, &insertAlert, NULL) == SQLITE_OK)
{
    NSDictionary *tmpDictionary;
    NSString *alertId;
    for(int i=0; i<[keys count]; i++)
    {
        alertId = [NSString stringWithFormat:@"%@", [keys objectAtIndex:i]];
        tmpDictionary  = [NSDictionary dictionaryWithDictionary:[dictionary2 objectForKey:alertId]];

        sqlite3_bind_text(insertAlert, 1, [NSString stringWithFormat:@"%@", [tmpDictionary objectForKey:@"alert_id"]], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(insertAlert, 2, [NSString stringWithFormat:@"%@", [tmpDictionary objectForKey:@"email_address"]], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(insertAlert, 3, [NSString stringWithFormat:@"%@", [tmpDictionary objectForKey:@"messege_text"]], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(insertAlert, 4, [NSString stringWithFormat:@"%@", [tmpDictionary objectForKey:@"when_to_send"]], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(insertAlert, 5, [NSString stringWithFormat:@"%@", [tmpDictionary objectForKey:@"how_often_send"]], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(insertAlert, 6, [NSString stringWithFormat:@"%@", [tmpDictionary objectForKey:@"recipient_phone_number"]], -1, SQLITE_TRANSIENT);

        if (sqlite3_step(insertAlert) == SQLITE_DONE) {
            sqlite3_reset(insertAlert);
            sqlite3_clear_bindings(insertAlert);
        }
        else {
            NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(textme.dbConn));
            //[textme showError:@"Device Error" errMsg:sqlite3_errmsg(textme.dbConn)];
            return FALSE;
        }

    }
    sqlite3_finalize(insertAlert);
}

1 Ответ

2 голосов
/ 26 мая 2010

Как вы думаете, sqlite3_bind_text () понимает, что делать с NSString? Я не знаю.

Я удивлен, что

  1. работает даже когда я == 0
  2. вы не видите предупреждения компилятора на всех этих связках.

Для исправления нужно заменить

[NSString stringWithFormat:@"%@", [tmpDictionary objectForKey:@"alert_id"]]

с

[[NSString stringWithFormat:@"%@", [tmpDictionary objectForKey:@"alert_id"]] UTF8String]

и аналогично для всех других строк sqlite3_bind_text ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...