I have an iPhone app which sends a request to a url posting a variable called submit:
+(NSMutableArray*)getQuestions:(NSString*)section from: (NSString*) url{
NSMutableArray *questions = [[NSMutableArray alloc] init];
//connect to database given by url
//NSError *error = nil;
//NSURLResponse *response = nil;
NSMutableString* myRequestString = [[NSMutableString string]initWithFormat:@"section=%@", section];
NSData *myRequestData = [NSData dataWithBytes: [myRequestString UTF8String] length: [myRequestString length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: url]];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
[request setHTTPMethod: @"POST"];
//post section
[request setHTTPBody: myRequestData];
//store them in the array;
return [questions autorelease];
}
My php file:
<?php
//connect to database
function connect() {
$dbh = mysql_connect ("localhost", "abc1", "12345") or die ('I cannot connect to the database because: ' . mysql_error());
mysql_select_db("PDS", $dbh);
return $dbh;
}
//store posted data
if(isset($_POST['section'])){
$dbh = connect();
$section = $_POST['section'];
$query = mysql_query("SELECT * FROM QUESTIONS WHERE sectionId = $section;") or die("Error: " . mysql_error());;
$rows = array();
while($r = mysql_fetch_assoc($query)) {
$rows[] = $r;
}
echo '{"questions":'.json_encode($rows).'}';
mysql_close();
}
?>
I have built a model class (Question) in objective c which has the exact properties that each row element has in the rows associative array.
My questions are:
1) How can I read the echo’d JSON array elements and their relative attributes in objective C?
2) How can I create an array of Question objects and map each one to an element in the rows array?
3) What do I have to write in my method “+(NSMutableArray*)getQuestions:(NSString*)section from: (NSString*) url” to capture the reply from the php (the echo)?
EDIT:
Here is the output of the php:
http://dev.speechlink.co.uk/David/get_questionstest.php
UPDATE
Changed method to use ASIHTTPRequest – Cannot deserialise JSON string:
//method to
+(NSDictionary*)getQuestions:(NSString*)sectionId from: (NSString*) url{
NSDictionary *questions;
NSURL *link = [NSURL URLWithString:url];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:link];
[request setPostValue:sectionId forKey:@"section"];
NSError *error = [request error];
[request startAsynchronous];
if (!error) {
//NSString *response = [request responseString];
//store them in the dictionary
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
NSString *json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
questions = [json objectFromJSONString];
NSLog(@"Data: %@", questions); //outputs Data: (null)
[json release];
[request release];
}else{
//UIAlertView to warn users there was an error
}
return questions;
}
Well, lets go through this one step at a time.
You can create a
NSDictionaryfrom JSON quite easily by using one of several different JSON parsing libraries. I really enjoy using JSONKit. Once you’ve importedJSONKit, into your project, you can do something like this:Now you have an array filled with the questions in your example. Now you can loop through this array and fill your data with the data in the array. Now lets be practical. It would be easier if you just had to manage one object instead of four for each question, wouldn’t it? Lets make a class that contains one question each instance.
Interface:
And implementation:
Now that’s just a basic example. Nothing fancy. Now you can loop through the array you had before and create “question” objects that contain each question’s data. For my purposes, suppose you have a
NSMutableArraynamedquestionsArraythat contain the questions you want to use. We’ll loop through the dictionary and add the questions from the dictionary into thequestionsArrayarray.Tada! Now you have an array filled with
Questionobjects. Any time you want to look at a property on any of the question objects, you can just simply access that property. For example, to grab the first question’s number, you can just do this:Please note this is all untested, as I don’t have my compiler with me. It should get you started, though. =)
Edit: You were doing your request completely wrong. Try this: