iOS 連接外部資料庫

消失了很久很久
這陣子幾乎都在研究objc+iOS
空餘時間也稍微摸了點Android
退伍前一陣子就沒碰程式
加上當兵的11個月大腦退化
再次開始寫也變得比較吃力
比起javascript、actionscript、java拿objc當作個重新開始更是挑戰

真正開始寫大約是8月初
第一週真的感覺室外星語
第二週xcode+一些簡單語法已經可以自在使用
第三週也就是現在...在資料處理上大致已經可以應付
寫了一個app也在測試階段,預計再不久就可以上架

廢話不多說進入主題
找了相當多相關資料只有一個感覺...有看沒有懂
使用MySQL.framework、使用C#的framework
但是小弟不才....完全給他看不懂
後來就想到過去使用flash remote的方式也算是用HTTP request的方式作中介
這樣也是有些優點
一、前後端的人可以同時進行進行作業(ex:工程師、設計師)
二、傳送資料更加單存純,可以減少封包量(也就是傳輸的資料更小)
三、等我想到再補

基於以上這些好處加上我對objc的不熟悉使用HTTP request是最好的方法
HTTP request簡單來說可以分成GET、POST兩種方式
基本上目前兩種都測試過沒問題,先以POST說明

首先從MySQL開始(由於我懶所以直接用phpMyAdmin)
先建立一個table
內容是怎樣自己而定(口語一點就是「你高興就好」)


基於上圖現在我們知道這table有三個欄位,分別為id、name、url
現再我們只要name欄位
使用php來作中介取得資料庫資料
<?php
$dbhost = "localhost"; //資料庫位置
$dbname = "test"; //資料庫名稱
$dbuser = "isken"; //帳戶名稱
$dbpass = "12345678"; //帳戶密碼

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error with MySQL connection');
mysql_select_db($dbname);
$sql = "select * from userProfile "; //MySQL語法
$result = mysql_query($sql) or die('MySQL query error');

while($row = mysql_fetch_array($result)){
echo $row['name']."||"; //print出來並在每一筆後面加上間隔
}
?>


print出來的結果如下圖,每一筆的中間都加上" || "作為間隔


測試成功後稍微修改一下為POST所使用
我懶...所以就拿帳號密碼改為post方式
<?php
$dbhost = "localhost"; //資料庫位置
$dbname = "test"; //資料庫名稱
$dbuser = $_POST[username]; //帳戶名稱
$dbpass = $_POST[password];; //帳戶密碼

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error with MySQL connection');
mysql_select_db($dbname);
$sql = "select * from userProfile "; //MySQL語法
$result = mysql_query($sql) or die('MySQL query error');

while($row = mysql_fetch_array($result)){
echo $row['name']."||"; //print出來並在每一筆後面加上間隔
}
?>


到這邊在http這邊已經完成準備
接著就是objc/cocoa的部份
首先開啟xcode建立新專案,在此建立最基礎"Window-base Application"即可


設定專案名稱,基本上看個人高興,在此以"connMySQL"為名


建立完成後會看到這畫面,到這都不是重點
右上方那空格內為建立此專案同時幫你創立的檔案


首先找到"connMySQLAppDelegate.m"內的這區域,也是所謂的程式進入點


接下來貼上這串code


請複製,我是個懶人,希望大家也跟我一樣XD
//宣告一個 NSMutableURLRequest 並給予一個記憶體空間
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
//宣告一個 NSURL 並給予記憶體空間、連線位置(放於本機localhost,檔案名稱為iphone.php)
NSURL *connection = [[NSURL alloc] initWithString:@"http://localhost/iphone.php"];

//宣告一個 string
NSString *string;
//宣告兩個字串分別為帳號、密碼,格式為"php端名稱=給予的內容"
NSString *string1=@"username=isken";
NSString *string2=@"&password=12345678";

//將兩個字串合併道地三個字串(其實有點多餘....)
string = [string1 stringByAppendingString:string2];

//宣告一個 NSMutableString 並給予記憶體位置,將內容設定為上面的string
NSMutableString *httpBodyString=[[NSMutableString alloc] initWithString:string];
//設定連線位置
[request setURL:connection];
//設定連線方式
[request setHTTPMethod:@"POST"];
//將編碼改為UTF8
[request setHTTPBody:[httpBodyString dataUsingEncoding:NSUTF8StringEncoding]];
//轉換為NSData傳送
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
//看print出來的值
NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);


寫好後當然就準備要run!
但是並沒有將內容呈現再畫面中,而是以print的方式所以先打開"Console"來看priont的結果
打開後就帥氣的點下"Build and Run"


按下後預設的模擬器(iphone Simulator)也會一併被開啟(就是畫面中的iphone)
不過他不是重點...因為寫的東西跟他一點關係都沒有,重點在"Console"內
所顯示的"user1||user2||user3||user4||user5||user7||user6||"就是database內的user欄位
當然還可以依照個人要求去下sql語法


不過這還是有問題...並沒有去把記憶體作釋放
簡單來說只要有給記憶體位置就要去釋放,不然程式多寫一點會常常crash(執行到一半跳出來)
有在".h"file 內宣告過的也必須在dealloc前釋放
看到內容有錯(紅色驚嘆號)、警告(黃色三角)其實要很開心,當你看不到他們還是一直crash才真的想哭

download example

2 則留言:

  1. 可以問怎麼把Console取出所要的資料到畫面上?

    回覆刪除
  2. 可以問怎麼把Console取出所要的資料到畫面上? +1

    回覆刪除