2011-06-21 79 views
0
i have an application in which i have 2 pages.one page is Register page and other is Login Page . 

when a new user enter values in the register page and click on the submit the values are initially submitted to the server database. 

When the same user come backs to the login page and enters his username and password and clicks on the submit button i get a JSON response on the console which returns the 




    {"TokenID":"fuUsat27to","isError":false,"ErrorMessage":"","Result":[{"UserId":"164","FirstName":"Indu","LastName":"nair","Email":"[email protected]","ProfileImage":null,"ThumbnailImage":null,"DeviceInfoId":"22"}],"ErrorCode":900} 




tokenID,USerID and DeviceID for every user and which are different for every user. 

when the submit button is pressed on the login page all the values are saved in sqlite database. 


In my login page i have 2 function first function checks that if user enter username and password and click on the submit button,the values should come from server if value is present in server . 

If value is present in server database then it will take value from server and put all data in sqlite database. 

This is all first time process for a new user.After all this happens the next function should be called. 

In this function work is only to check username and password present in sqlite database . 

If username and password is present then open the page otherwise show an error message. 

-(void)check 
{ 
    app.journeyList = [[NSMutableArray alloc]init]; 
    [self createEditableCopyOfDatabaseIfNeeded]; 

    NSString *filePath = [self getWritableDBPath]; 

    sqlite3 *database; 

    if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) { 
     const char *sqlStatement = "SELECT Username,Password FROM UserInformation where Username=? and Password=?"; 
     sqlite3_stmt *compiledStatement; 
     if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 
      sqlite3_bind_text(compiledStatement, 1, [Uname.text UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(compiledStatement, 2, [Password.text UTF8String], -1, SQLITE_TRANSIENT); 
      //NSString *loginname= [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]; 
      //   NSString *loginPassword = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)]; 




     } 
     if(sqlite3_step(compiledStatement) != SQLITE_ROW) { 
      //NSLog(@"Save Error: %s", sqlite3_errmsg(database)); 
      UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"UIAlertView" message:@"User is not valid" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [alert show]; 
      [alert release]; 
      alert = nil; 
     } 
     else { 

      isUserValid = YES; 
      if (isUserValid) { 
       app = (JourneyAppDelegate *)[[UIApplication sharedApplication]delegate]; 
       TTabBar *tabbar=[[TTabBar alloc] init]; 
       [app.navigationController pushViewController:tabbar animated:YES]; 
       tabbar.selectedIndex = 0; 



      }  
     } 

     sqlite3_finalize(compiledStatement); 
    } 
    sqlite3_close(database);   
} 



//this is used when the user first time log in the server and sends 
-(void)sendRequest 
{ 

    UIDevice *device = [UIDevice currentDevice]; 
    NSString *udid = [device uniqueIdentifier]; 
    NSString *sysname = [device systemName]; 
    NSString *sysver = [device systemVersion]; 
    NSString *model = [device model]; 
    NSLog(@"idis:%@",[device uniqueIdentifier]); 
    NSLog(@"system nameis :%@",[device systemName]); 
    NSLog(@"System version is:%@",[device systemVersion]); 
    NSLog(@"System model is:%@",[device model]); 
    NSLog(@"device orientation is:%d",[device orientation]); 
    NSString *post = [NSString stringWithFormat:@"Loginkey=%@&Password=%@&DeviceCode=%@&Firmware=%@&IMEI=%@",Uname.text,Password.text,model,sysver,udid]; 
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 
    NSLog(@"%@",postLength); 
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
    [request setURL:[NSURL URLWithString:@"http://192.168.0.1:96/JourneyMapperAPI?RequestType=Login"]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:postData]; 

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    if (theConnection) { 
     webData = [[NSMutableData data] retain]; 
     NSLog(@"%@",webData); 
    } 
    else 
    { 

    } 

} 



-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    [webData setLength: 0]; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{   
    [webData appendData:data]; 

} 

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{  
    [connection release]; 
    [webData release]; 

} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{  
    NSString *loginStatus = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@",loginStatus); 
    // this is to perfrom insert opertion on the userinformation table 

    NSString *json_string = [[NSString alloc] initWithData:webData encoding:NSUTF8StringEncoding]; 

    NSDictionary *result = [json_string JSONValue]; 
    // 
    BOOL errortest = [[result objectForKey:@"isError"] boolValue]; 
    if(errortest == FALSE) 
    { 
    values = [result objectForKey:@"Result"]; 
    NSLog(@"Valid User"); 
    } 
    else 
    { 
    NSLog(@"Invalid User"); 
    } 

    NSMutableArray *results = [[NSMutableArray alloc] init]; 

    for (int index = 0; index<[values count]; index++) { 
    NSMutableDictionary * value = [values objectAtIndex:index]; 
    Result * result = [[Result alloc] init]; 
    result.UserID = [value objectForKey:@"UserId"]; 
    result.FirstName = [value objectForKey:@"FirstName"]; 
    result.LastName =[value objectForKey:@"LastName"]; 
    result.Email =[value objectForKey:@"Email"]; 
    result.ProfileImage =[value objectForKey:@"ProfileImage"]; 
    result.ThumbnailImage =[value objectForKey:@"ThumbnailImage"]; 
    result.DeviceInfoId =[value objectForKey:@"DeviceInfoId"]; 
    NSLog(@"%@",result.UserID); 


    [results addObject:result]; 
    [result release]; 
    } 



    for (int index = 0; index<[results count]; index++) { 
    Result * result = [results objectAtIndex:index]; 
    //save the object variables to database here 


    [self createEditableCopyOfDatabaseIfNeeded]; 

    NSString *filePath = [self getWritableDBPath]; 

    sqlite3 *database; 

     //this four lines of code are for creating timestap and journeyID in userjourney table. 
    //NSTimeInterval timeStamp = [[NSDate date] timeIntervalSince1970]; 
// NSNumber *timeStampObj = [NSNumber numberWithInt: timeStamp]; 
// NSLog(@"%@",timeStampObj); 
// NSString *journeyid = [NSString stringWithFormat:@"%@_%@_%@", result.UserID, result.DeviceInfoId, timeStampObj]; 
    if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) { 
    const char *sqlStatement = "insert into UserInformation(UserID,DeviceId,Username,Password,FirstName,Email) VALUES (?,?,?,?,?,?)"; 
    sqlite3_stmt *compiledStatement; 
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 
    //sqlite3_bind_text(compiledStatement, 1, [journeyid UTF8String],-1,SQLITE_TRANSIENT); 
    sqlite3_bind_text(compiledStatement, 1, [result.UserID UTF8String],-1,SQLITE_TRANSIENT); 
    sqlite3_bind_text(compiledStatement, 2, [result.DeviceInfoId UTF8String],-1,SQLITE_TRANSIENT); 
    sqlite3_bind_text(compiledStatement, 3, [Uname.text UTF8String],-1,SQLITE_TRANSIENT); 
    sqlite3_bind_text(compiledStatement, 4, [Password.text UTF8String],-1,SQLITE_TRANSIENT); 
    sqlite3_bind_text (compiledStatement, 5, [result.FirstName UTF8String],-1,SQLITE_TRANSIENT); 
    sqlite3_bind_text (compiledStatement, 6, [result.Email UTF8String],-1,SQLITE_TRANSIENT); 

    } 
    if(sqlite3_step(compiledStatement) != SQLITE_DONE) { 
    NSLog(@"Save Error: %s", sqlite3_errmsg(database)); 
    } 
    else { 
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"UIAlertView" message:@"Record added" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
    alert = nil; 
    } 

    sqlite3_finalize(compiledStatement); 
    } 
    sqlite3_close(database); 
    } 




    [loginStatus release];   
    [connection release]; 
    [webData release]; 
} 



-(IBAction)buttonPressed:(id)sender 
{ 
    [[Reachability sharedReachability] setHostName:kHostName]; 
    //Set Reachability class to notifiy app when the network status changes. 
    [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES]; 
    //Set a method to be called when a notification is sent. 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:@"kNetworkReachabilityChangedNotification" object:nil]; 
    [self updateStatus]; 
    [self sendRequest]; 
    //NSLog(<#NSString *format#>) 
    //this is to select username and password from database. 
    [self check]; 

    //Gpassq = Password.text; 
    //Gunameq = Uname.text; 

    //[self check]; 




} 

- (void)reachabilityChanged:(NSNotification *)note { 
    [self updateStatus]; 
} 

- (void)updateStatus 
{ 
    // Query the SystemConfiguration framework for the state of the device's network connections. 
    self.internetConnectionStatus = [[Reachability sharedReachability] internetConnectionStatus]; 
    if (self.internetConnectionStatus == NotReachable) { 
     //show an alert to let the user know that they can't connect... 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Network Status" 
                 message:@"Sorry, our network guro determined that the network is not available. Please try again later." 
                 delegate:self 
               cancelButtonTitle:nil 
               otherButtonTitles:@"OK", nil]; 
     [alert show]; 
    } else { 
     // If the network is reachable, make sure the login button is enabled. 
     //_loginButton.enabled = YES; 
    } 
} 

回答

0

這很簡單。先點擊提交按鈕,從Sqlite數據庫中獲取用戶名和所有與用戶相關的值。如果所有值都找不到,那麼你繼續進行服務器進程。如果數據庫中的所有值直接進入應用程序的下一個屏幕。

編輯

僞代碼 -

- (IBAction)SubmitTapped:(id) sender { 
    //Check if Database already contains userName and password 
    if(userName && password){ 
    //user name and password found in database 
    //show next screen or authenticate user through web services as per your requirement. 
    } 
    else { 
     //First time login 
     //Validate user entered data like values of textfields.(Suggestion use DHValidation for validating textfields) 

    BOOL validate = [self validateData];//a function to validate data using DHValidation create yourself. 
    if(validate){ 
    //save login credentails into database 
    //show next screen 
    } 
    } 
} 

我希望你現在明白了。

UPDATE

-(void)check 
{ 
    app.journeyList = [[NSMutableArray alloc]init]; 
    [self createEditableCopyOfDatabaseIfNeeded]; 

    NSString *filePath = [self getWritableDBPath]; 

    sqlite3 *database; 

    if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) { 
     const char *sqlStatement = "SELECT Username,Password FROM UserInformation where Username=? and Password=?"; 
     sqlite3_stmt *compiledStatement; 
     if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 
      sqlite3_bind_text(compiledStatement, 1, [Uname.text UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(compiledStatement, 2, [Password.text UTF8String], -1, SQLITE_TRANSIENT); 
      //NSString *loginname= [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]; 
      //   NSString *loginPassword = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)]; 




     } 
     if(sqlite3_step(compiledStatement) != SQLITE_ROW) { 
      //NSLog(@"Save Error: %s", sqlite3_errmsg(database)); 
      // UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"UIAlertView" message:@"User is not valid" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
//   [alert show]; 
//   [alert release]; 
//   alert = nil; 

      //we have no data into database so send request to webserver. 
      yourAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
      if(appDelegate.internetConnectionStatus != NotReachable){ 
       //Network Available 
       [self sendRequest]; 
      } 
     } 
     else { 

      isUserValid = YES; 
      if (isUserValid) { 
       app = (JourneyAppDelegate *)[[UIApplication sharedApplication]delegate]; 
       TTabBar *tabbar=[[TTabBar alloc] init]; 
       [app.navigationController pushViewController:tabbar animated:YES]; 
       tabbar.selectedIndex = 0; 



      }  
     } 

     sqlite3_finalize(compiledStatement); 
    } 
    sqlite3_close(database);   
} 



//this is used when the user first time log in the server and sends 
-(void)sendRequest { 

    UIDevice *device = [UIDevice currentDevice]; 
    NSString *udid = [device uniqueIdentifier]; 
    NSString *sysname = [device systemName]; 
    NSString *sysver = [device systemVersion]; 
    NSString *model = [device model]; 

    NSLog(@"idis:%@",[device uniqueIdentifier]); 
    NSLog(@"system nameis :%@",[device systemName]); 
    NSLog(@"System version is:%@",[device systemVersion]); 
    NSLog(@"System model is:%@",[device model]); 
    NSLog(@"device orientation is:%d",[device orientation]); 

    NSString *post = [NSString stringWithFormat:@"Loginkey=%@&Password=%@&DeviceCode=%@&Firmware=%@&IMEI=%@",Uname.text,Password.text,model,sysver,udid]; 
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 
    NSLog(@"%@",postLength); 
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
    [request setURL:[NSURL URLWithString:@"http://192.168.0.1:96/JourneyMapperAPI?RequestType=Login"]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:postData]; 

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    if (theConnection) { 
     webData = [[NSMutableData data] retain]; 
     NSLog(@"%@",webData); 
    } 
    else 
    { 

    } 

} 



-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    [webData setLength: 0]; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{   
    [webData appendData:data]; 

} 

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{  
    [connection release]; 
    [webData release]; 

} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{  
    NSString *loginStatus = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@",loginStatus); 
    // this is to perfrom insert opertion on the userinformation table 

    NSString *json_string = [[NSString alloc] initWithData:webData encoding:NSUTF8StringEncoding]; 

    NSDictionary *result = [json_string JSONValue]; 
    // 
    BOOL errortest = [[result objectForKey:@"isError"] boolValue]; 
    if(errortest == FALSE) 
    { 
     values = [result objectForKey:@"Result"]; 
     NSLog(@"Valid User"); 
    } 
    else 
    { 
     NSLog(@"Invalid User"); 
    } 

    NSMutableArray *results = [[NSMutableArray alloc] init]; 

    for (int index = 0; index<[values count]; index++) { 
     NSMutableDictionary * value = [values objectAtIndex:index]; 
     Result * result = [[Result alloc] init]; 
     result.UserID = [value objectForKey:@"UserId"]; 
     result.FirstName = [value objectForKey:@"FirstName"]; 
     result.LastName =[value objectForKey:@"LastName"]; 
     result.Email =[value objectForKey:@"Email"]; 
     result.ProfileImage =[value objectForKey:@"ProfileImage"]; 
     result.ThumbnailImage =[value objectForKey:@"ThumbnailImage"]; 
     result.DeviceInfoId =[value objectForKey:@"DeviceInfoId"]; 
     NSLog(@"%@",result.UserID); 


     [results addObject:result]; 
     [result release]; 
    } 



    for (int index = 0; index<[results count]; index++) { 
     Result * result = [results objectAtIndex:index]; 
     //save the object variables to database here 


     [self createEditableCopyOfDatabaseIfNeeded]; 

     NSString *filePath = [self getWritableDBPath]; 

     sqlite3 *database; 

     //this four lines of code are for creating timestap and journeyID in userjourney table. 
     //NSTimeInterval timeStamp = [[NSDate date] timeIntervalSince1970]; 
     // NSNumber *timeStampObj = [NSNumber numberWithInt: timeStamp]; 
     // NSLog(@"%@",timeStampObj); 
     // NSString *journeyid = [NSString stringWithFormat:@"%@_%@_%@", result.UserID, result.DeviceInfoId, timeStampObj]; 
     if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) { 
      const char *sqlStatement = "insert into UserInformation(UserID,DeviceId,Username,Password,FirstName,Email) VALUES (?,?,?,?,?,?)"; 
      sqlite3_stmt *compiledStatement; 
      if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 
       //sqlite3_bind_text(compiledStatement, 1, [journeyid UTF8String],-1,SQLITE_TRANSIENT); 
       sqlite3_bind_text(compiledStatement, 1, [result.UserID UTF8String],-1,SQLITE_TRANSIENT); 
       sqlite3_bind_text(compiledStatement, 2, [result.DeviceInfoId UTF8String],-1,SQLITE_TRANSIENT); 
       sqlite3_bind_text(compiledStatement, 3, [Uname.text UTF8String],-1,SQLITE_TRANSIENT); 
       sqlite3_bind_text(compiledStatement, 4, [Password.text UTF8String],-1,SQLITE_TRANSIENT); 
       sqlite3_bind_text (compiledStatement, 5, [result.FirstName UTF8String],-1,SQLITE_TRANSIENT); 
       sqlite3_bind_text (compiledStatement, 6, [result.Email UTF8String],-1,SQLITE_TRANSIENT); 

      } 
      if(sqlite3_step(compiledStatement) != SQLITE_DONE) { 
       NSLog(@"Save Error: %s", sqlite3_errmsg(database)); 
      } 
      else { 
       UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"UIAlertView" message:@"Record added" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
       [alert show]; 
       [alert release]; 
       alert = nil; 
      } 

      sqlite3_finalize(compiledStatement); 
     } 
     sqlite3_close(database); 
    } 

    [loginStatus release];   
    [connection release]; 
    [webData release]; 
} 



-(IBAction)buttonPressed:(id)sender 
{ 
    //it should be on application did finish launching 

    [[Reachability sharedReachability] setHostName:kHostName]; 
    //Set Reachability class to notifiy app when the network status changes. 
    [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES]; 
    //Set a method to be called when a notification is sent. 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:@"kNetworkReachabilityChangedNotification" object:nil]; 

    //it will be called automatically you don't need to expilictly call this function 
    // [self updateStatus]; 


    //The above code should be in application did finish launching. 


    //NSLog(<#NSString *format#>) 
    //this is to select username and password from database. 
    [self check]; 

    //Gpassq = Password.text; 
    //Gunameq = Uname.text; 

    //[self check]; 




} 

- (void)reachabilityChanged:(NSNotification *)note { 
    [self updateStatus]; 
} 

- (void)updateStatus 
{ 
    // Query the SystemConfiguration framework for the state of the device's network connections. 
    self.internetConnectionStatus = [[Reachability sharedReachability] internetConnectionStatus]; 
    if (self.internetConnectionStatus == NotReachable) { 
     //show an alert to let the user know that they can't connect... 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Network Status" 
                 message:@"Sorry, our network guro determined that the network is not available. Please try again later." 
                 delegate:self 
               cancelButtonTitle:nil 
               otherButtonTitles:@"OK", nil]; 
     [alert show]; 
    } else { 
     // If the network is reachable, make sure the login button is enabled. 
     //_loginButton.enabled = YES; 
    } 
} 
+0

你能解釋我詳細我越來越糊塗」 – Rani

+0

@Rani看到更新的答案 –

+0

拉胡爾看到我更新的問題,我必須創建兩個機能的研究,我有tocall插入機能的研究只是一次再我想打電話omnly chek函數在超時如何我可以在你的ans代碼中調用兩個函數請幫助我,我必須把我的功能,如果條件 – Rani

相關問題