Xcode: SQLite во встроенном методе - PullRequest
0 голосов
/ 02 сентября 2011

Я имею дело с новой проблемой.Я начал со следующего кода:

-(IBAction) Login:(id) sender{

    const char *dbpath = [databasePath UTF8String];
    sqlite3_stmt *statement;

    if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
    {
        NSString *querySQL = [NSString stringWithFormat: @"SELECT * FROM Contacts WHERE Login= (\"%@\") AND Password = (\"%@\")", Login.text, Password.text];

        const char *query_stmt = [querySQL UTF8String];

        if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)
        {
            if (sqlite3_step(statement) == SQLITE_ROW)
            {
                //Store '1' when a user wants to stay logged 
                **if(logSwitch.on){
                    [self aStayLogged];
                }else{
                    [self aReleaseLogged];
                }**
                Model *model = [Model sharedModel];
                model.paramLogged = Login.text;
                //[self openSecondView:nil];

            } else {
                Status.text = @"Login failed: Please check your ID and Password";
            }

            sqlite3_finalize(statement);
        }
        sqlite3_close(contactDB);
    }
}

-(void) aStayLogged {

    sqlite3_stmt *statement;

    const char *dbpath = [databasePath UTF8String];

    if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
    {
            NSString *updateSQL = [NSString stringWithFormat: @"UPDATE CONTACTS SET LOGGED = '1' WHERE LOGIN = (\"%@\")", Login.text];     
            const char *update_stmt = [updateSQL UTF8String];      
            sqlite3_prepare_v2(contactDB, update_stmt, -1, &statement, NULL);

        int success = sqlite3_step(statement);
            if (success == SQLITE_ERROR) {
                //NSAssert1(0, @"Error: failed to insert into the database with message '%s'.", sqlite3_errmsg(contactDB));
                Status.text = @"Update failed";
            }else{
                **Status.text = @"Stay OK";**
            }
        //sqlite3_bind_text(statement, 1, [coffeeName UTF8String], -1, SQLITE_TRANSIENT);
        //sqlite3_bind_int(statement, 2, coffeeID);

        sqlite3_finalize(statement);
    }
    sqlite3_close(contactDB);
}

Вот предложение: если я связываю метод 'aStayLogged' как IBAction с кнопкой, обновление выполняется правильно.Но когда я встраиваю этот метод в метод Login, ничего не происходит!

Я проверяю это с помощью метода:

-(IBAction) Check{

    sqlite3_stmt *statement;

    const char *dbpath = [databasePath UTF8String];

    if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
    {
        NSString *querySQL = [NSString stringWithFormat: @"SELECT LOGIN FROM CONTACTS WHERE LOGGED = '1'"]; 
        const char *query_stmt = [querySQL UTF8String];

        sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL);

        if (sqlite3_step(statement) == SQLITE_ROW) {

            NSString *loggedField = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)];

            Status.text = loggedField;

            [loggedField release];

        }else{

            Status.text = @"Update failed";

        }

        sqlite3_finalize(statement);
    }
    sqlite3_close(contactDB);    

}

Самое смешное, что статус меняется на «Оставайся в порядке», что является подтверждением того, что он должен был работать!У кого-нибудь есть идея, что может быть причиной этого?Извините за длинный пост - я также задаю глупые вопросы, но на этот раз я действительно этого не вижу ...

Ответы [ 2 ]

0 голосов
/ 02 сентября 2011

Хм, я думаю, что вы использовали неправильно, чтобы проверить с SQLITE_ERROR, потому что есть много других кодов состояния, которые не завершены, вам лучше проверить на SQLITE_OK или SQLITE_ROW, и если вы получили этот код состояния, чем вы сделалину.

Если вы получили ошибку, используйте sqlite3_errmsg, чтобы узнать, что пошло не так.Я думаю, что-то с SQLITE_BUSY возможно или LOCK

0 голосов
/ 02 сентября 2011

Я Подозреваю Ваша проблема здесь:

    int success = sqlite3_step(statement);
    if (success == SQLITE_ERROR) {
        //NSAssert1(0, @"Error: failed to insert into the database with message '%s'.", sqlite3_errmsg(contactDB));
        Status.text = @"Update failed";
    }else{
        **Status.text = @"Stay OK";**
    }

Проверьте фактический результат sqlite3_step. Вы должны продолжать наступать, пока оно не станет SQLITE_DONE.

Подобные проблемы намного проще диагностировать, если вы проверяете результаты SQLite после каждого вызова, а не просто объединяете их в цепочку.

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