AppDelegate.h
@property (strong, nonatomic) IBOutlet UIWindow *window;
@property (strong, nonatomic) IBOutlet
UINavigationController *nav;
@property (nonatomic, retain) NSString *apiURL;
AppDelegate.m
@synthesize apiURL;
@synthesize nav;
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
apiURL =
@"http://FolderPath/XML/";
self.window.rootViewController = nav;
[self.window
makeKeyAndVisible];
return YES;
}
ViewController.h
@class
ip23AppDelegate,
Student;
@interface ip23ViewController : UIViewController <NSXMLParserDelegate,
UITableViewDataSource,
UITableViewDelegate>
{
ip23AppDelegate
*appDel;
Student *aRecord;
NSMutableString
*recordsStr;
NSMutableArray
*recordsArr;
}
@property (nonatomic, retain) IBOutlet UIActivityIndicatorView
*processActView;
@property (nonatomic, retain) IBOutlet UITableView
*recordsTblView;
@property (nonatomic, retain) IBOutlet UIBarButtonItem *refreshBarBtn,
*addBarBtn;
- (IBAction)refreshBtnPressed:(id)sender;
- (IBAction)addBtnPressed:(id)sender;
@end
ViewController.m
#import "ViewController.h"
#import "AppDelegate.h"
#import "Student.h"
#import "MyFunctions.h"
#import "StudentCellViewController.h"
@implementation ip23ViewController
@synthesize processActView,
recordsTblView;
@synthesize refreshBarBtn,
addBarBtn;
- (IBAction)refreshBtnPressed:(id)sender
{
[self
initTableAndView];
}
- (IBAction)addBtnPressed:(id)sender
{
Student *sObj =
[[Student alloc] init];
sObj.Name =
@"Alex";
sObj.Age =
@"16";
sObj.Perc =
@"90.16";
NSOperationQueue
*queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]
initWithTarget:self selector:@selector(addRecordRequest:) object:sObj];
[queue
addOperation:operation];
}
- (void)viewDidLoad
{
[super
viewDidLoad];
self.navigationItem.leftBarButtonItem = refreshBarBtn;
self.navigationItem.rightBarButtonItem = addBarBtn;
appDel =
(ip23AppDelegate *)[[UIApplication sharedApplication] delegate];
[self
initTableAndView];
}
- (void)didReceiveMemoryWarning
{
[super
didReceiveMemoryWarning];
// Dispose of any
resources that can be recreated.
}
#pragma mark - Add
- (void)addRecordResponse:(NSString *)response
{
if([response
isEqualToString:@"OK"])
{
[[[UIAlertView
alloc] initWithTitle:@"Success!"
message:@"Record added
successfully."
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil] show];
[self
initTableAndView];
}
else if([response
isEqualToString:@"INVALID PARAMETER"])
{
[[[UIAlertView
alloc] initWithTitle:@"Warning!"
message:@"Record is not added.\nPlease varify your data."
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil] show];
}
else
{
[[[UIAlertView
alloc] initWithTitle:@"Warning!"
message:@"Something went wrong.\nPlease try again later."
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil] show];
}
}
- (void)addRecordRequest:(Student *)sObj
{
NSString *boundary
= @"---------------------------14737809831466499882746641449";
NSString
*contentType = [NSString stringWithFormat:@"multipart/form-data;
boundary=%@", boundary];
NSMutableData *body
= [NSMutableData data];
[body
appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary]
dataUsingEncoding:NSUTF8StringEncoding]];
[body
appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data;
name=\"Name\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body
appendData:[sObj.Name dataUsingEncoding:NSUTF8StringEncoding]];
[body
appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body
appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary]
dataUsingEncoding:NSUTF8StringEncoding]];
[body
appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data;
name=\"Age\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body
appendData:[sObj.Age dataUsingEncoding:NSUTF8StringEncoding]];
[body
appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body
appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary]
dataUsingEncoding:NSUTF8StringEncoding]];
[body
appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data;
name=\"Perc\"\r\n\r\n"]
dataUsingEncoding:NSUTF8StringEncoding]];
[body
appendData:[sObj.Perc dataUsingEncoding:NSUTF8StringEncoding]];
[body
appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body
appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary]
dataUsingEncoding:NSUTF8StringEncoding]];
[body
appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data;
name=\"action\"\r\n\r\n"]
dataUsingEncoding:NSUTF8StringEncoding]];
[body
appendData:[@"add" dataUsingEncoding:NSUTF8StringEncoding]];
[body
appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
// close form
[body
appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary]
dataUsingEncoding:NSUTF8StringEncoding]];
NSString
*urlString = [NSString stringWithFormat:@"%@/student.php",
appDel.apiURL];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request
setURL:[NSURL URLWithString:urlString]];
[request
setHTTPMethod:@"POST"];
[request
addValue:contentType forHTTPHeaderField:@"Content-Type"];
[request
setHTTPBody:body];
NSData *returnData
= [NSURLConnection sendSynchronousRequest:request returningResponse:nil
error:nil];
NSString
*returnString = [[NSString alloc] initWithData:returnData
encoding:NSUTF8StringEncoding];
[self
performSelectorOnMainThread:@selector(addRecordResponse:)
withObject:returnString waitUntilDone:NO];
}
#pragma mark - Delete
- (void)deleteRecordResponse:(NSString *)response
{
if([response
isEqualToString:@"OK"])
{
//Action
}
else
{
[[[UIAlertView
alloc] initWithTitle:@"Warning!"
message:@"Something went wrong.\nPlease try again later."
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil] show];
[self
initTableAndView];
}
//NSLog(@"%@", response);
}
- (void)deleteRecordRequest:(Student *)sObj
{
NSString *post
=[NSString stringWithFormat:@"action=delete&StudentId=%@",
sObj.StudentId];
NSData *postData =
[post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString
*postLength = [NSString stringWithFormat:@"%d", [postData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request
setURL:[NSURL URLWithString:[NSString
stringWithFormat:@"%@/student.php", appDel.apiURL]]];
[request
setHTTPMethod:@"POST"];
[request
setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request
setValue:@"application/x-www-form-urlencoded"
forHTTPHeaderField:@"Content-Type"];
[request
setHTTPBody:postData];
NSURLResponse
*response;
NSData
*urlData=[NSURLConnection sendSynchronousRequest:request
returningResponse:&response error:nil];
NSString *resp =
[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
[self
performSelectorOnMainThread:@selector(deleteRecordResponse:) withObject:resp
waitUntilDone:NO];
}
#pragma mark - XML Parse
- (void)initTableAndView
{
recordsTblView.userInteractionEnabled = NO;
processActView.hidden = NO;
recordsArr =
[[NSMutableArray alloc] init];
NSOperationQueue
*queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]
initWithTarget:self selector:@selector(getApiData) object:nil];
[queue
addOperation:operation];
}
- (void)loadDataInTable
{
recordsTblView.userInteractionEnabled = YES;
processActView.hidden = YES;
[recordsTblView
reloadData];
}
- (void)getApiData
{
NSString
*myApiLink = [NSString stringWithFormat:@"%@student.php?action=list",
appDel.apiURL];
//NSLog(@"%@", myApiLink);
NSURL *url =
[[NSURL alloc] initWithString:myApiLink];
NSXMLParser
*xParse = [[NSXMLParser alloc] initWithContentsOfURL:url];
[xParse
setDelegate:self];
[xParse parse];
[self
performSelectorOnMainThread:@selector(loadDataInTable) withObject:nil waitUntilDone:NO];
}
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary
*)attributeDict
{
if([elementName
isEqualToString:@"Student"])
{
aRecord =
[[Student alloc] init];
}
}
- (void)parser:(NSXMLParser *)parser
foundCharacters:(NSString *)string
{
if(!recordsStr)
recordsStr = [[NSMutableString alloc]
initWithString:string];
else
[recordsStr appendString:string];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString
*)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString
*)qName
{
if([elementName
isEqualToString:@"Students"])
{
return;
}
else
if([elementName isEqualToString:@"Student"])
{
[recordsArr
addObject:aRecord];
aRecord
= nil;
}
else
{
if([elementName isEqualToString:@"StudentId"] ||
[elementName isEqualToString:@"Name"] ||
[elementName isEqualToString:@"Age"] ||
[elementName isEqualToString:@"Perc"])
{
[aRecord
setValue:recordsStr forKey:elementName];
}
}
recordsStr = nil;
}
#pragma mark - Table Methods
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 100;
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
{
return
recordsArr.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString
*CellIdentifier = @"Cell";
UITableViewCell
*cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
Student *sObj =
[recordsArr objectAtIndex:indexPath.row];
StudentCellViewController *studentCellVC = [[StudentCellViewController
alloc] init];
studentCellVC.studentObj = sObj;
[cell.contentView
addSubview:studentCellVC.view];
return cell;
}
- (void)tableView:(UITableView *)tableView
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath
{
Student *sObj =
[recordsArr objectAtIndex:indexPath.row];
NSOperationQueue
*queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]
initWithTarget:self selector:@selector(deleteRecordRequest:) object:sObj];
[queue
addOperation:operation];
[recordsArr
removeObjectAtIndex:indexPath.row];
[recordsTblView
beginUpdates];
[recordsTblView
deleteRowsAtIndexPaths:[[NSArray alloc] initWithObjects:indexPath, nil]
withRowAnimation:UITableViewRowAnimationMiddle];
[recordsTblView
endUpdates];
}
@end
MyFunctions.h
+ (NSString *)trim:(NSString *)stringToTrim;
MyFunctions.m
+ (NSString *)trim:(NSString *)stringToTrim
{
return
[stringToTrim stringByTrimmingCharactersInSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet]];
}
Student.h
@property (nonatomic, retain) NSString *StudentId,
*Name,
*Age,
*Perc;
Student.m
@synthesize StudentId,
Name,
Age,
Perc;
StudentCellViewController.h
@property (nonatomic, retain) IBOutlet UILabel *NameLbl,
*AgeLbl,
*PercLbl;
@property (nonatomic, retain) Student *studentObj;
@class Student;
StudentCellViewController.m
#import "StudentCellViewController.h"
#import "Student.h"
#import "MyFunctions.h"
@implementation StudentCellViewController
@synthesize NameLbl,
AgeLbl,
PercLbl;
@synthesize studentObj;
- (void)viewDidLoad
{
[super
viewDidLoad];
NameLbl.text =
[MyFunctions trim:studentObj.Name];
AgeLbl.text =
[NSString stringWithFormat:@"%@yr", [MyFunctions
trim:studentObj.Age]];
PercLbl.text =
[NSString stringWithFormat:@"%@%%", [MyFunctions
trim:studentObj.Perc]];
}
API
API Links
Read:
http://Folderpath/XML/student.php?action=list
Add:
http:// Folderpath
/XML/student.php?action=add&Name=Alex&Age=16&Perc=90
Edit:
http:// Folderpath
/XML/student.php?action=edit&Name=Alex&Age=16&Perc=90.86&StudentId=3
Delete:
http:// Folderpath /XML/student.php?action=delete&StudentId=3
student-list.php
<?php
header ("content-type:
text/xml");
sleep(3);
echo '<?xml
version="1.0" encoding="UTF-8"?>
<Students>
<Student>
<Name>Alan</Name>
<Age>18</Age>
<Perc>88.90</Perc>
</Student>
<Student>
<Name>Bob</Name>
<Age>20</Age>
<Perc>85.60</Perc>
</Student>
<Student>
<Name>Alex</Name>
<Age>16</Age>
<Perc>90.16</Perc>
</Student>
</Students>';
?>
student-list.xml
<?xml
version="1.0" encoding="UTF-8"?>
<Students>
<Student>
<Name>Alan</Name>
<Age>18</Age>
<Perc>88.90</Perc>
</Student>
<Student>
<Name>Bob</Name>
<Age>20</Age>
<Perc>85.60</Perc>
</Student>
<Student>
<Name>Alex</Name>
<Age>16</Age>
<Perc>90.16</Perc>
</Student>
</Students>
Student.php
<?php
$DB_Host = "localhost";
$DB_Name =
"test_ios_trainees";
$DB_Username = "root";
$DB_Password = "root123";
$WEBSITE_URL = "http://FolderPath/XML/";
$con = mysql_connect($DB_Host,
$DB_Username, $DB_Password) or die(mysql_errno());
$db = mysql_select_db($DB_Name,
$con) or die(mysql_error());
$action = (
isset($_REQUEST["action"]) &&
trim($_REQUEST["action"]) != "" ) ?
trim($_REQUEST["action"]) : "";
$xmlHeader = '<?xml
version="1.0" encoding="UTF-8"?>';
if($action == "list")
{
header
("content-type: text/xml");
$xml = $xmlHeader;
$xml .=
'<Students>';
$sqry = "SELECT *
FROM students ORDER BY Name ASC";
$sres =
mysql_query($sqry) or die("can not select form students -
".mysql_error());
while($srow =
mysql_fetch_array($sres))
{
$xml .=
'<Student>';
$xml
.= '<StudentId>'.trim($srow["StudentId"]).'</StudentId>';
$xml
.= '<Name>'.trim($srow["Name"]).'</Name>';
$xml
.= '<Age>'.trim($srow["Age"]).'</Age>';
$xml
.= '<Perc>'.trim($srow["Perc"]).'</Perc>';
$xml .=
'</Student>';
}
mysql_free_result($sres);
$xml .=
'</Students>';
echo $xml;
exit;
}
else if($action == "add")
{
if( isset($_REQUEST["Name"])
&& trim($_REQUEST["Name"]) != "" &&
isset($_REQUEST["Age"])
&& trim($_REQUEST["Age"]) != "" &&
isset($_REQUEST["Perc"])
&& trim($_REQUEST["Perc"]) != "")
{
$iqry =
"INSERT INTO students SET
Name
= '".trim($_REQUEST["Name"])."',
Age
= '".(int)trim($_REQUEST["Age"])."',
Perc
= '".(float)trim($_REQUEST["Perc"])."'";
mysql_query($iqry)
or die("can not insert into students - ".mysql_error());
echo
"OK";
exit;
}
else
{
echo
"INVALID PARAMETER";
exit;
}
}
else if($action == "edit")
{
if( isset($_REQUEST["StudentId"])
&& trim($_REQUEST["StudentId"]) != "" &&
isset($_REQUEST["Name"])
&& trim($_REQUEST["Name"]) != "" &&
isset($_REQUEST["Age"])
&& trim($_REQUEST["Age"]) != "" &&
isset($_REQUEST["Perc"])
&& trim($_REQUEST["Perc"]) != "")
{
$iqry =
"UPDATE students SET
Name
= '".trim($_REQUEST["Name"])."',
Age
= '".(int)trim($_REQUEST["Age"])."',
Perc
= '".(float)trim($_REQUEST["Perc"])."'
WHERE
StudentId = '".trim($_REQUEST["StudentId"])."'";
mysql_query($iqry)
or die("can not update students - ".mysql_error());
echo
"OK";
exit;
}
else
{
echo
"INVALID PARAMETER";
exit;
}
}
else if($action ==
"delete")
{
if( isset($_REQUEST["StudentId"])
&& trim($_REQUEST["StudentId"]) != "")
{
$iqry =
"DELETE FROM students WHERE StudentId =
'".trim($_REQUEST["StudentId"])."'";
mysql_query($iqry)
or die("can not delete from students - ".mysql_error());
echo
"OK";
exit;
}
else
{
echo
"INVALID PARAMETER";
exit;
}
}
else
{
echo "Nothing is
here for you!";
exit;
}
?>
No comments:
Post a Comment