#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:@»выбрать * из информации пользователя»];