проблема со страницей входа в iphone

#iphone #objective-c #sqlite

#iPhone #objective-c #sqlite

Вопрос:

Я получаю ту же проблему, одну из stackoverflow, которая:

 if(sqlite3_open([dbPath UTF8String], amp;database) == SQLITE_OK)
{
    //const char *sql ="select Username@'%@',Password@'%@' from userinformation";
    NSString *sql = [[NSString alloc] initWithFormat:@"select * from UserInformation where UserName='%@' and Password='%@' ",Username.text,Password.text];
    sqlite3_stmt *selectSatement;

    // Here i am getting the problem.Im not sure why sqlite3_prepare_v2 ins't meeting SQLITE_OK 
    if( sqlite3_prepare_v2(database, [sql UTF8String], -1, amp;selectSatement, NULL) == SQLITE_OK)
    {
        //-------------------------------------
        //Loop all the 
        NSString *user1 = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectSatement, 0)];
        NSLog(@"%@",user1);
    }
}
  

Мы высоко ценим любую помощь в этом.

Ответ №1:

Прежде всего: если вы открываете базу данных, вам также следует закрыть ее с помощью sqlite3_close (database)

Я написал в приведенном ниже коде инструкцию assert, которая сообщит вам, если что-то не так с вашим запросом. Далее вы можете получить сообщение об ошибке, если ваш пароль или имя пользователя по какой-то причине «nil», поэтому я немного изменил способ установки имени пользователя и пароля. Если значение не существует, оно равно «0»

 if(sqlite3_open([dbPath UTF8String], amp;database) == SQLITE_OK)
{
    char *errorMsg;

    NSString *sql = [[NSString alloc] initWithFormat: @"SELECT * FROM UserInformation WHERE UserName="%@" and Password ="%@"", Username.text, Password.text];
    if (sqlite3_exec (database, [sql UTF8String], NULL, NULL, amp;errorMsg) != SQLITE_OK)
    {
        sqlite3_close(database);
        NSAssert1(0, @"Error selecting data: %s", sqlite3_errmsg(database));
    }
    else
    {
        NSString *user1 = [NSString stringWithUTF8String:((char *)sqlite3_column_text(compiledStatement, 0) ? (char *)sqlite3_column_text(compiledStatement, 0) : (char *)"0")];
        NSString *password1 = [NSString stringWithUTF8String:((char *)sqlite3_column_text(compiledStatement, 1) ? (char *)sqlite3_column_text(compiledStatement, 1) : (char *)"0")];
        NSLog(@"%@: %@",user1,password1);
    }
    [sql release];
}
sqlite3_close(database);
  

Что вы также должны иметь в виду, так это то, что база данных должна существовать по заданному пути, вызывая, например, следующий метод

 -(void) checkAndCreateDatabase
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if([fileManager fileExistsAtPath:dbPath]) return;
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
    [fileManager release];
}
  

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

1. выдает ошибку 2011-04-06 15: 37: 24.232 logintes1[18130: 207] *** Ошибка утверждения в -[Проверка logintes1ViewController], /Users/HarishYadav/ Desktop/logintes1/ Classes/logintes1ViewController.m: 72 2011-04-06 15:37: 24.243 logintes1[18130: 207] *** Завершение работы приложения из-за неперехваченного исключения ‘ Исключение NSInternalInconsistencyException’, причина: ‘Ошибка выбора данных: библиотечная процедура вызывается не по порядку’ *** Стек вызовов при первом запуске:

2. Вы должны убедиться, что имя таблицы и атрибуты написаны правильно, если есть одна небольшая ошибка (например, с заглавными буквами, поскольку запрос чувствителен к регистру), вы не сможете выполнить запрос должным образом.

Ответ №2:

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

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

1. это дает мне правильные результаты. для печати в журнале я использую NSString * sql = [[NSString alloc] initWithFormat:@»выберите * из UserInformation, где UserName =’%@’ и Password= ‘%@’ «,Username.text,Password.text]; NSLog(@»%@», sql);

2. когда я использую точку останова в коде. BP, когда появляется if(sqlite3_prepare_v2(database, [sql UTF8String], -1, amp;selectSatement, NULL) == SQLITE_OK), тогда он напрямую выходит из области видимости

3. удалите предложение where и попробуйте еще раз .. и дайте мне знать… NSString * sql = [[NSString alloc] initWithFormat:@»выбрать * из информации пользователя»];