问题描述
我正在尝试在我的应用程序中注册用户.
我有一个带有3 textfields (username, password and confirmpassword)
和一个submit
按钮的视图控制器.
I am trying to Sign up a user in my application.
I have a view controller with 3 textfields (username, password and confirmpassword)
and a submit
button.
按下提交按钮时,将调用以下方法:
The following method is called when submit button is pressed:
-(IBAction)addUser
{
NSString *tempUser,*tempPass, *tempConfPass;
tempUser = [[NSString alloc]init];
tempPass = [[NSString alloc]init];
tempConfPass = [[NSString alloc]init];
tempUser = [NSString stringWithFormat:@"%@",_mUserName.text];
tempPass = [NSString stringWithFormat:@"%@",_mPassword.text];
tempConfPass = [NSString stringWithFormat:@"%@",_mConfPassword.text];
signupUser = [[UseDb alloc]init];
flagUser = [signupUser addNewUser:_mUserName.text:_mPassword.text:_mConfPassword.text];
if(flagUser)
{
myAlertViewUser = [[UIAlertView alloc] initWithTitle:@"Error" message:@"User Added"
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[myAlertViewUser show];
}
else {
_mStatus.text = @"failed to add user";
myAlertViewUser = [[UIAlertView alloc] initWithTitle:@"Error" message:@"passwords don't match"
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[myAlertViewUser show];
}
}
,此方法由addUser
方法调用:
-(BOOL)addNewUser:(NSString *)newUser :(NSString *)newPassword :(NSString *)confirmPass
{
NSLog(@"%@....%@...%@",newUser, newPassword, confirmPass);
sqlite3_stmt *statement;
const char *dbpath = [_mDatabasePathDb UTF8String];
if (sqlite3_open(dbpath, &_mDb) == SQLITE_OK && [newPassword isEqualToString:confirmPass] && ![newUser isEqualToString:@""] && ![newPassword isEqualToString:@""])
{
self.userName = [NSString stringWithFormat:@"%@",newUser];
self.password = [NSString stringWithFormat:@"%@",newPassword];
NSString *insertSQL = [NSString stringWithFormat:
@"INSERT INTO USERDETAIL VALUES (\"%@\",\"%@\",\"%@\", \"%@\",\"%@\", \"%@\",\"%@\", \"%@\",\"%@\", \"%@\",\"%@\")",self.userName,self.password,@"",@"",@"",@"",@"",@"",@"",@"",@"" ];
NSLog(@"%@",insertSQL);
const char *insert_stmt = [insertSQL UTF8String];
sqlite3_prepare_v2(_mDb, insert_stmt, -1, &statement, NULL);
if (sqlite3_step(statement) == SQLITE_DONE)
{
return YES;
/* mUserName.text = @"";
mPassword.text = @"";
mConfPassword.text = @""; */
}
else {
NSLog(@"failed to add user");
}
sqlite3_finalize(statement);
sqlite3_close(_mDb);
}
}
在addNewUser
方法中,if (sqlite3_step(statement) == SQLITE_DONE)
总是显示为false
,语句在
In the addNewUser
method, if (sqlite3_step(statement) == SQLITE_DONE)
is always coming out to be false
, statement has some value before
sqlite3_prepare_v2(_mDb, insert_stmt, -1, &statement, NULL);
,但是在执行上述语句后变为nil
.我不明白为什么会这样.
请帮助.
but turns to nil
after the above statement is executed. I don't understand why that is happening.
Please help.
推荐答案
这可能与您正在执行的检查有关,请尝试使用SQLITE_OK.它在 docs 中表示为在旧版界面(旧界面)中,返回值将为 SQLITE_BUSY,SQLITE_DONE,SQLITE_ROW,SQLITE_ERROR或SQLITE_MISUSE .使用"v2"界面,也可能会返回任何其他结果代码或扩展结果代码.
This can be an issue with the check you are doing, try SQLITE_OK. Its said here in docs as In the legacy interface(older interface), the return value will be either SQLITE_BUSY, SQLITE_DONE, SQLITE_ROW, SQLITE_ERROR, or SQLITE_MISUSE. With the "v2" interface, any of the other result codes or extended result codes might be returned as well.
if (sqlite3_prepare_v2(_mDb, insert_stmt, -1, &statement, nil) == SQLITE_OK)
{
if (sqlite3_step(statement) == SQLITE_DONE)
{
return YES;
}
else
{
NSLog(@"failed to add user");
}
sqlite3_finalize(statement);
}
您还可以找到类似的问题及其答案这里
you can also find a similar question and its answer here
在prepare语句后插入花括号,并在finalize语句后将其关闭.当您获得SQLITE_MISUSE时,可能是该例程被不适当地调用.可能是在已经完成的预准备语句或先前返回SQLITE_ERROR或SQLITE_DONE的语句上调用了它.或者可能是两个或多个线程同时使用同一数据库连接.
Insert a curly brace after the prepare statement and close it after finalize statement. As you get SQLITE_MISUSE, it can be that this routine was called inappropriately. Perhaps it was called on a prepared statement that has already been finalized or on one that had previously returned SQLITE_ERROR or SQLITE_DONE. Or it could be the case that the same database connection is being used by two or more threads at the same moment in time.
希望这会有所帮助:)
这篇关于sqlite3_step(statement)== SQLITE_DONE始终为false的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!