오늘의 튜토리얼은 코로나 Ambassador 이면서 Mobile App Development with Corona: Getting
Started.”의 저자인 Brian Burton 의 글입니다. 이글은 Burton’s Media Group에서 발표된 내용입니다.
제가 자주 하는 질문 중 하나가 remote server 에서 어떻게 데이터를 mobile app 으로 전달할 수가 있는가 입니다. (대개 그 데이터는 데이터베이스에 저장되 있겠죠.)
이와 관련해서 가장 좋은 방법을 소개해 드리려고 많이 연구했습니다. 아마 얼마나 많은 방법들을 제가 시도해 봤는지 알려드리려면 시리즈를 연재해야 될 겁니다. 데이터를 가지고 올 수 있는 방법은 아주 많이 있고 또 여러 possibilities 들도 많이 있습니다. 모두 찾아내려면 아마 끝이 안 날 겁니다. 그래서 이것들을 더 찾아내고나서 몇달 후에 얘기하는 것보다 리모트 서버에서 모바일 앱으로 데이터를 전달하는 한가지 방법이라도 우선 소개해 드리는게 좋을 것 같습니다.
The Process
간단하게 하기 위해 표준 3-tier architecture 를 사용할 겁니다.
Remote Database
이 튜토리얼에서는 리모트 서버에 MySQL을 만들어 둘 겁니다. 3개의 필드를 가지고 있는 1개의 테이블을 사용하겠습니다. (id, Movie (title), Year (영화가 릴리즈 된 해)
Logic or Middleware
MySQL 데이트베이스로부터 데이터를 pull 해 오기 위한 middleware 로 PHP를 사용하겠습니다. 그리고 그 데이터를 모바일 디바이스에 return 하기 전에 JSON format 으로 encoding 할 겁니다.
<?php
$host="localhost"; //replace with your hostname $username="database_example"; //replace with your username $password="Password"; //replace with your password $db_name="MyMovies"; //replace with your database $con=mysql_connect("$host", "$username", "$password")or die("cannot connect"); mysql_select_db("$db_name") or die ("cannot select DB"); $sql = "select * from BestMovies"; //replace with your table name $result = mysql_query($sql);$json = array(); if(mysql_num_rows($result)){while($row=mysql_fetch_row($result)){ $json[]=$row; } } mysql_close($db_name); echo json_encode($json); ?>
Client
아래는 remote server 로부터 정보를 가져오고 JSON 형식으로 된 그 정보를 decode 하는 코로나 소스코드 입니다. 이 파일을 local SQLite file로 저장하세요. 그리고 나서 SQLite 의 content 로 화면에 load 하세요. 데이터베이스는 persistent 입니다. 그러니까 이 코드를 여러번 실행해서 remote database를 call 하면 SQLite 데이터베이스에 new data 를 계속 추가할 겁니다.
local sqlite3 = require ("sqlite3")
local myNewData local json = require ("json")local decodedData
local SaveData = function ()
--Save new data to a sqlite file --open SQLite database, if it doesn't exist, create database local path = system.pathForFile("movies.sqlite", system.DocumentsDirectory) db = sqlite3.open( path ) print(path) --setup the table if it doesn't exist local tablesetup = "CREATE TABLE IF NOT EXISTS mymovies
(id INTEGER PRIMARY KEY, movie, year);" db:exec( tablesetup ) print(tablesetup) --save data to database local counter = 1 local index = "movie"..counter local movie = decodedData[index] print(movie)
while ( movie ~= nil ) do local tablefill ="INSERT INTO mymovies
VALUES (NULL,'" .. movie[2] .. "','" .. movie[3] .."');" print(tablefill) db:exec( tablefill ) counter=counter+1 index = "movie"..counter movie = decodedData[index] end --everything is saved to SQLite database; close database db:close() --Load database contents to screen --open database local path = system.pathForFile("movies.sqlite", system.DocumentsDirectory) db = sqlite3.open( path ) print(path) --print all the table contents local sql = "SELECT * FROM mymovies" for row in db:nrows(sql) do local text = row.movie.." "..row.year local t = display.newText( text, 20, 30 * row.id, native.systemFont, 24 ) t:setTextColor( 255,255,255 ) end db:close()
end
local function networkListener( event )
if ( event.isError ) then print( "Network error!") else myNewData = event.response print ("From server: "..myNewData) decodedData = (json.decode( myNewData)) SaveData() end
end
network.request( "http://www.BurtonsMediaGroup.com/myMovies.php",
"GET", networkListener )
여기까지가 기본적인 튜토리얼 입니다. 유튜브에 좀 더 자세하게 설명한 비디오를 올렸습니다.
보시려면 유튜브를 참조하세요.
'Corona SDK > Corona SDK TIPs' 카테고리의 다른 글
간단하게 디버그용 print 구문들 실행되지 않도록 하기 (0) | 2013.01.23 |
---|---|
FAQ Wednesday : Custom Fonts 사용하기 (0) | 2013.01.18 |
Corona tip: Shuffle it! (0) | 2013.01.10 |
Corona TIP : display.remove()와 object:removeSelf() 의 차이 (0) | 2013.01.10 |
수요일의 FAQ - Local Notification (Android) (0) | 2012.12.07 |
원하는 애니메이션 효과 내기 -Library- (0) | 2012.11.14 |
Lua 의 퍼포먼스 향상을 위해 알아두어야 할 것 들 (0) | 2012.11.07 |
수요일의 FAQ : Lua 프로그래밍 팁들 (0) | 2012.11.02 |
FAQ Wednesday: Display Objects (0) | 2012.10.26 |
Sprite Sheet 활용하기 (Advanced) (0) | 2012.10.12 |