#iphone #objective-c #sqlite
#iPhone #objective-c #sqlite
Вопрос:
Друг, я действительно так признался, что мне делать. Вот мой код.
@синтезировать имя пользователя, пароль; -(недействительно)createDatabaseIfNeeded {
BOOL success;
NSError *error;
//FileManager - Object allows easy access to the File System.
NSFileManager *FileManager = [NSFileManager defaultManager];
//Get the complete users document directory path.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//Get the first path in the array.
NSString *documentsDirectory = [paths objectAtIndex:0];
//Create the complete path to the database file.
NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:@"Journeymapper.sql"];
//Check if the file exists or not.
success = [FileManager fileExistsAtPath:databasePath];
//If the database is present then quit.
if(success) return;
//the database does not exists, so we will copy it to the users document directory]
NSString *dbPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Journeymapper.sql"];
//Copy the database file to the users document directory.
success = [FileManager copyItemAtPath:dbPath toPath:databasePath error:amp;error];
//If the above operation is not a success then display a message.
//Error message can be seen in the debugger's console window.
if(!success)
NSAssert1(0, @"Failed to copy the database. Error: %@.", [error localizedDescription]);
}
-(void)check
{
//Get the database and connect to it.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:@"Journeymapper.sql"];
//open the database
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;
//Preoare the select Statment
int returnValue = sqlite3_prepare_v2(database, [sql UTF8String], -1, amp;selectSatement, NULL);
NSLog(@"%i",returnValue);
if( sqlite3_prepare_v2(database, [sql UTF8String], -1, amp;selectSatement, NULL) == SQLITE_OK)
{
NSString *user1 = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectSatement, 0)];
NSLog(@"%@",user1);
}
}
}
-(IBAction)Login
{
[self check];
}
проблема в том, что здесь:-Я не уверен, почему sqlite3_prepare_v2
не проходит встреча SQLITE_OK
.
if( sqlite3_prepare_v2(database, [sql UTF8String], -1, amp;selectSatement, NULL) == SQLITE_OK)
Мы высоко ценим любую помощь в этом.
Комментарии:
1. Journeymapper.sql я думаю, вам следует использовать sqlite вместо sql
2. Что возвращается из вызова sqlite3_prepare_v2()? Точная возвращаемая ошибка должна дать вам подсказку. Смотрите sqlite.org/capi3ref.html#sqlite3_errcode Также обратите внимание, что вам действительно следует привязать заполнители (UserName=? и Password=?, затем установите их значения с помощью функций sqlite3_bind_*). Это позволит избежать проблем с экранированием и, следовательно, SQL-инъекции.
3. Он не показывает мне никаких ошибок, приложение запущено, но оно не проверяет qlite3_prepare_v2(), где мой UIAlertView или NSLog для отображения результатов, возвращаемых вызовом sqlite3_prepare_v2(), и указывает:-Точка останова выходит из цикла
4. Есть ли какой-либо другой способ сделать это, если да, пришлите мне пример кода
5. Не просто вставляйте свой код в вопрос. Вам нужно переформатировать его, чтобы заменить табуляции пробелами, а также форматирование кода запускается, только если вы сделаете отступ на четыре пробела.
Ответ №1:
Почему вы пытаетесь подготовить инструкцию дважды? Вы должны использовать sqlite3_step() для оценки вашего подготовленного заявления.
Кстати, ваш код уязвим для атак с использованием SQL-инъекций. Вместо замены строки use и пароля в инструкцию select вам следует использовать sqlite3_bind() для привязки ваших параметров к подготовленной инструкции.
Комментарии:
1. можете ли вы привести мне пример, как это использовать
2. @user420220: В прикрепленном сообщении в блоге приведен пример примерно на полпути вниз. icodeblog.com/2008/08/19 /…
3. как можно использовать sqlite3_bind () с sqlite_exec(). Как я могу передать два запроса «один для пароля и одно имя пользователя», а затем как я могу сравнить это с моими «user.text и password.text», которые вводит пользователь.
4. @user420220: Сообщение в блоге и ваш код между ними отвечают на все вопросы. Боюсь, у меня нет времени писать для вас вашу программу.
5. Спасибо за ответ. Но у меня также есть один вопрос: можно ли пометить карту фотографией