2013年1月23日水曜日

iPhoneでXMLファイルからデータを取得する

サーバーからデータ取得してiPhoneで使用したい場合はXML形式で読み込むようにしています。
このやり方が正しいのかイマイチわからないのが1人で作業するとこの難しさだと感じてます。
だれか正攻法教えてください。

まずはサーバー側ではPHPでXML形式のデータを作成。

createXML.php
&lt?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 &ltoundation/Foundation.h&gt

@interface XMLParseAppDelegate : NSObject&ltUIApplicationDelegate, NSXMLParserDelegate&gt
{
 
    NSMutableArray *members;
    BOOL inIdElement;
    BOOL inNameElement;
    BOOL inPictElement;
    NSMutableString *name;
    NSMutableString *ID;
    NSMutableString *pict;
}

- (void)loadData;


@end
こんな感じでデータをiPhoneからデータベースに接続して データを取得したりしてます。

iPhoneでPOSTメソッドによるデータを取得する方法

iPhoneではGETメソッドでデータをやり取りするのは簡単だけど、 POSTメソッドでやりとりする場合少しめんどくさい。

GETでデータを送信する場合はURLに入れればいいだけでできる。

NSString *s = [NSString stringWithFormat:@"http://localhost:8888/index.php?table_name=products&query_type=select"];    
NSURL  *url = [NSURL URLWithString:s];

POSTメソッドの場合はリクエストをNSMutableURLRequestで宣言する。
その後、POSTメソッドで送る内容をリクエストのHTTPBodyに代入することで可能となる。
    NSURL *url = [[NSURL alloc]initWithString:@"http://localhost:8888/dbconnect/POSTMethodFromiOS.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];

POSTメソッドでサーバにデータを送る場合は、何かしらの処理をした結果を取得したいと思う。
僕はXML形式に処理されたデータを変換し、そのデータを取得するようにしている。

2013年1月7日月曜日

2013年 目標


2013年の目標は、「技術向上」と「将来のための土台作り」にしようと考えている。

永らく自分のやりたいことはなんだろうと考え続けていたのだけど、少しヒントが見つかった。

キーワードは「IT×芸術」。

シドニー現代美術館で見た芸術作品のようなものを自分でも創りたい、自分が感動したような感覚を他の人に味わってもらいたいと思うようになったのです。

正直25歳にしてこう思うようになったのは遅すぎる気がしなくもないけど、思い立ったのだからやってみようと思ってます。

このブログの立ち位置としては、そのための情報発信としたいと思います。
発信内容は以下3点
1.学んだ技術情報
 -iPhoneアプリ開発(objective-c)
   -webアプリ開発(HTML+CSS+javascript)
   -Microsoft SharePoint(これは仕事で扱っているためおまけ的な感じ)
2.制作物
3.感銘を受けた芸術作品

僕が感銘を受けたのはこの作品です。

drawing machine by Benjamin Forster