サーバーからデータ取得してiPhoneで使用したい場合はXML形式で読み込むようにしています。
このやり方が正しいのかイマイチわからないのが1人で作業するとこの難しさだと感じてます。
だれか正攻法教えてください。
まずはサーバー側ではPHPでXML形式のデータを作成。
createXML.php
<?php
include_once "DatabaseClass.php";
if(!empty($_POST)){
$database = new Database;
$table = "user_name";
$email = $_POST['email'];
$password = $_POST['password'];
$select = sprintf('SELECT id, name, picture FROM %s WHERE email="%s" AND password="%s"',
mysql_real_escape_string($table),
mysql_real_escape_string($email),
mysql_real_escape_string($password));
$row = $database->array_select($select);
if($row != NULL){
$xml = "\n";
$xml.= '';
$xml.="\n";
foreach($row as $value){
$xml.="\n";
$id=$value["id"];
$xml.="\t$id\n";
$name=$value["name"];
$xml.="\t$name\n";
$pict=$value["picture"];
$xml.="\t$pict\n";
$xml.="\n";
}//foreach
$xml.="\n";
echo $xml;
} //if($row != NULL)
$database->close();
}
?>
iPhoneからはPOSTメソッドでデータを送信し、返り値をNSXMLParserオブジェクトに代入してデータを取得する。
XMLParseAppDelegate.m
- (void)loadData{
NSURL *url = [[NSURL alloc]initWithString:@"http://localhost:8888/createXML.php"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url];
// MethodにPOSTを指定する。
request.HTTPMethod = @"POST";
NSString *email = @"momo@momochibi.com";
NSString *password = @"momo";
NSString *body = [NSString stringWithFormat:@"email=%@&password=%@",email,password];
request.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];
//XML形式のデータを取得
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:returnData];
[parser setDelegate:self];
[parser parse];
}
// XMLのパース開始
- (void)parserDidStartDocument:(NSXMLParser *)parser {
// 初期化処理
//statuses = [NSMutableArray array];
members = [NSMutableArray array];
membersPicture = [NSMutableArray array];
inIdElement = NO;
inNameElement = NO;
inPictElement = NO;
}
// XMLのパース終了
- (void)parserDidEndDocument:(NSXMLParser *)parser {
// 取得したデータを出力する
for (NSString *member in members) {
NSLog(@"%@", member);
}
}
// 要素の開始タグを読み込み
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:@"id"]) {
// nameタグの中に入った
inIdElement = YES;
ID = [NSMutableString string];
}
if ([elementName isEqualToString:@"name"]){
inNameElement =YES;
name = [NSMutableString string];
}
if( [elementName isEqualToString:@"pict"] ){
inPictElement = YES;
pict = [NSMutableString string];
}
}
// 要素の閉じタグを読み込み
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"member"]) {
// memberタグが終わるタイミングで、membersにメンバーを追加する
NSString *s = [NSString stringWithFormat:@"%@: %@ : %@", ID, name, pict];
[members addObject:s];
NSString *ps = [NSString stringWithFormat:@"%@",pict];
[membersPicture addObject:ps];
} else if ([elementName isEqualToString:@"id"]) {
// idタグから出た!
inIdElement = NO;
} else if ([elementName isEqualToString:@"name"]) {
// nameタグから出た!
inNameElement = NO;
} else if ([elementName isEqualToString:@"pict"]) {
inPictElement = NO;
}
}
// テキストデータ読み込み
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
// テキストデータは複数回に分けて呼び出されることがある
if (inIdElement) {
[ID appendString:string];
}
else if (inNameElement) {
[name appendString:string];
}
else if (inPictElement){
[pict appendString:string];
}
}
XMLParseAppDelegate.h
#import <oundation/Foundation.h>
@interface XMLParseAppDelegate : NSObject<UIApplicationDelegate, NSXMLParserDelegate>
{
NSMutableArray *members;
BOOL inIdElement;
BOOL inNameElement;
BOOL inPictElement;
NSMutableString *name;
NSMutableString *ID;
NSMutableString *pict;
}
- (void)loadData;
@end
こんな感じでデータをiPhoneからデータベースに接続して
データを取得したりしてます。