objective-csqlitenetwork-programmingsqlitejdbc

How to check whether netconnection is available or not in iPhone?


I have an application in which I have login form which username and password textfields. when user enter his/her username and password and click on the submit button, then it will go to server API database and check whether user is valid or not. If connection is not their values are checked in SQLite database.

If in SQLite database if users username and password are validated then the user is allowed to enter into the application otherwise he would have to register. I tried the following code but now I am confused where should have to put my code.

I have check both server connection and SQLite connection. My answer is if user login again and again then username and password should always check first from server not in SQLite database. If server is OFF then username and password should check from SQLite database.

This is my code:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];

    internetReachable = [[Reachability reachabilityForInternetConnection] retain];
    [internetReachable startNotifier];

    // check if a pathway to a random host exists
    hostReachable = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain];
    [hostReachable startNotifier];

The callback is as follows;

- (void) checkNetworkStatus:(NSNotification *)notice
{
    // called after network status changes

    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    switch (internetStatus)

    {
        case NotReachable:
        {
            break;

        }
        case ReachableViaWiFi:
        {
            break;

        }
        case ReachableViaWWAN:
        {
            break;

        }
    }

    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
    switch (hostStatus)

    {
        case NotReachable:
        {
            break;

        }
        case ReachableViaWiFi:
        {
            break;

        }
        case ReachableViaWWAN:
        {
            break;

        }
    }
}

This is my api controller, where I am fetching values from my API server and inserting values in SQLite database:

//
//  apicontroller.m
//  apitest
//
//  Created by raji.nair on 6/10/11.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "apicontroller.h"
#import "Result.h"
#import "global.h"

#import <sqlite3.h>
#define DATABASE_NAME @"journey.sqlite"
#define DATABASE_TITLE @"journey"



@implementation apicontroller
@synthesize  txtUserName;
@synthesize txtPassword;
@synthesize txtfirstName;
@synthesize txtlast;
@synthesize txtEmail;
@synthesize webData;    

- (NSString *) getWritableDBPath {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    return [documentsDir stringByAppendingPathComponent:DATABASE_NAME];
}

-(void)createEditableCopyOfDatabaseIfNeeded 
{
    // Testing for existence
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:DATABASE_NAME];
    NSLog(@"%@",writableDBPath);

    success = [fileManager fileExistsAtPath:writableDBPath];
    if (success)
        return;

    // The writable database does not exist, so copy the default to
    // the appropriate location.
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath]
                               stringByAppendingPathComponent:DATABASE_NAME];
    success = [fileManager copyItemAtPath:defaultDBPath
                                   toPath:writableDBPath
                                    error:&error];
    if(!success)
    {
        NSAssert1(0,@"Failed to create writable database file with Message : '%@'.",
                  [error localizedDescription]);
    }
}

-(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=%@",txtUserName.text,txtPassword.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.68:91/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);  

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

    NSDictionary *result = [json_string JSONValue];
    NSArray *values = [result objectForKey:@"Result"];
    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;

        if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) {
            NSDate *dt = [NSDate date]; //get current date
            NSString *timestamp = [dt description];
            NSString *journeyid = [NSString stringWithFormat:@"%@_%@_%@", result.UserID, result.DeviceInfoId, timestamp];

            const char *sqlStatement = "insert into UserInformation(UserID,DeviceId,FirstName,Email,JourneyID) VALUES (?,?,?,?,?)";
            sqlite3_stmt *compiledStatement;
            if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK)    {
                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, [result.FirstName UTF8String],-1,SQLITE_TRANSIENT);
                sqlite3_bind_text (compiledStatement, 4, [result.Email UTF8String],-1,SQLITE_TRANSIENT);
                sqlite3_bind_text(compiledStatement, 5, [journeyid 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)click:(id)sender
{
    [self sendRequest];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    [txtfirstName resignFirstResponder];
    [txtlast resignFirstResponder];
    [txtUserName resignFirstResponder];
    [txtPassword resignFirstResponder];
    [txtEmail resignFirstResponder];
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {


    [super viewDidLoad];
    //[self sendRequest];
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc. that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
}


@end

This is class where I am creating nsstring variables of my json object:

//
//  Result.h
//  apitest
//
//  Created by pradeep.yadav on 6/14/11.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>


//TokenID":"Vao13gifem","isError":false,"ErrorMessage":"","Result":[{"UserId":"153","FirstName":"Rocky","LastName":"Yadav","Email":"rocky@itg.com","ProfileImage":null,"ThumbnailImage":null,"DeviceInfoId":"12"}],"ErrorCode":900}
//Terminating in response to SpringBoard's termination.



@interface Result : NSObject {

    NSString * UserID;
    NSString *FirstName;
    NSString *LastName;
    NSString *Email;
    NSString *ProfileImage;
    NSString *ThumbnailImage;
    NSString *DeviceInfoId;
}
@property (nonatomic,retain) NSString *UserID;
@property (nonatomic,retain) NSString *FirstName;
@property (nonatomic,retain) NSString *LastName;
@property (nonatomic,retain) NSString *Email;
@property (nonatomic,retain) NSString *ProfileImage;
@property (nonatomic,retain) NSString *ThumbnailImage;
@property (nonatomic,retain) NSString *DeviceInfoId;

@end



//
//  Result.m
//  apitest
//
//  Created by pradeep.yadav on 6/14/11.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "Result.h"


@implementation Result
@synthesize UserID;
@synthesize FirstName;
@synthesize LastName;
@synthesize Email;
@synthesize ProfileImage;
@synthesize ThumbnailImage;
@synthesize DeviceInfoId;





- (void)dealloc {
    [super dealloc];
    [UserID release];
    [FirstName release];
    [LastName release];
    [Email release];
    [ProfileImage release];
    [ThumbnailImage release];
    [DeviceInfoId release];
}


@end

If my server API that is available through netconnection is not available then my username and password values should be fetched and validated from database.


Solution

  •  NSMutableURLRequest * serviceRequest = [NSMutableURLRequest requestWithURL:serviceUrl];
    [serviceRequest setValue:@"text/xml" forHTTPHeaderField:@"Content-type"];
    [serviceRequest setHTTPMethod:@"POST"];
    [serviceRequest setHTTPBody:[xmlString dataUsingEncoding:NSUTF8StringEncoding]];
    NSData *responseData;
    NSURLResponse * serviceResponse;
    NSError * serviceError;
    responseData = [NSURLConnection sendSynchronousRequest:serviceRequest returningResponse:&serviceResponse error:&serviceError];
    NSString *resp=[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    NSLog(@"RETRIEVING:%@",resp);
    
    if(responseData != NULL)
    {
    //connection exist
    }
    else
    {
    //Connection doesn't exist
    }