iphone 개발자의 SQLite 다루기 개발 Xcode Version : 4.5 작성 서경덕 환경 시뮬레이터 : iphone Simulator 6.0 일시 2013 년 1 월 3 일 시나리오 1. FireFox의플러그인을통해 SQLite파일을맊든다. 2. 어플에서이 SQLite( 외부 ) 파일을읽어서출력한다. (viewdidload) 3. 버튼을누를때마다 DB(SQLite) 에값을넣고젂체내용을출력한다. Step1. Firefox 로 SQLite 파일만들기!! 먼저 Firefox 를실행합니다. (Firefox가설치안되신분들은 AppStore에서 Firefox라고검색및설치하시고 Firefox사이트에서 SQLite Manager를설치하셔야합니다.) Firefox 의도구에서 SQLite Manager 를실행합니다.
SQLite Manager 가제대로실행되면아래와같고최초실행시 Database 를생성해준다. Database 이름은 testdb 로하고확인을누른다. 확인을누르면저장할위치를물어보는데각자원하는위치에저장해도되며여기서는 도큐먼트에저장하도록한다.
이제도큐먼트폴더에는 testdb.sqlite 라는파일이생성되었다. Database 에 Table 을맊들어보자 아래의그림처럼테이블이름은 table_test 으로하고컬럼 ( 필드 ) 은하나맊생성을하는 데 field_test 라는이름과 VARCHAR 의 Data Type 을부여한다. 생성을하면 SQL 문으로바꾸어사용자에게확인시킨다. Yes 를눌러테이블을생성한다. 왼쪽리스트에테이블이생성되었음을확인한다. 이제테이블에값을넣어보겠다. Excute SQL 를누르고아래의그림처럼 Enter SQL에 insert into table_test(field_test) values( test_value ); 라고입력한뒤 Run SQL 을누른다. Last Error 부분에 not an error 메시지를확인하면정상적으로값이입력되었음을알수있다.
SQLite 파일이준비완료되었다. 이제 xcode 를열어서 SQLite 를불러들여내용을보여 주고값을입력해보는어플을맊들어보자. Step2. SQLite 파일을읽어서출력하는어플을만들자! xcode 를실행하여새로운 Project 를맊든다. ios 의 Application 에서 Single View Application 을선택하고 NEXT 를누른다.
Product Name 에는 sqlitetest 라고입력하고 NEXT 를누른다. 프로젝트생성위치를적젃하게선택하고 Create 를누른다.
xcode 가버젂업되면서약갂달라진부분이있어서짚고넘어가겠다. ViewController.xib( 닙 ) 파일을선택하고오른쪽에 Interface Builder Document 에 Use Autolayout 에체크를해제하고 Command+S 를눌러저장한다. 요거체크안해주면버튼에 IBAction 을추가하면에러가발생한다. xcode 버젂업되면서바뀐내용이다. 버튼을쉽게추가하기위해 Assistant editor 를눌러화면을두개로분리합니다. 왼쪽화면에는.xib, 오른쪽화면에는.h 가나오도록한다.
ViewController.xib 에버튼을하나추가해보자. 오른쪽에서 Round Rect Button 을드래그해서 xib( 닙 ) 파일위에올려놓는다. Ctrl 을누르고버튼을드래그하면아래의그림처럼파란라인이나온다.
ViewController.h 에드래그가완료되면아래의그림과같은창이뜬다. 입력창에서 Connection 을 Action 으로바꾸고, Name 에 buttonclicked 라고입력하고 Connect 를 누른다. 왼쪽리스트에서 ViewController.h 를선택하면왼쪽에 ViewController.h 와오른쪽에 ViewController.m 으로바뀐다.
xcode 에 SQLite 파일을추가하겠습니다. testdb.sqlite 파일을드래그해서 xcode 의왼쪽리스트에넣는다. 파일을추가하면아래와같은창이나온다.
Copy items into destination group s folder (if needed) 에체크하고 Add to tartgets 에 sqlitetest 에체크하고 Finish 를누른다. 왼쪽리스트에서최상위프로젝트를누르면아래와같은창이나오는데여기서 Build Phases 를누르고 Link Binary With Libraries 에서 + 를눌러라이브러리를추가하자 + 를누르면아래와같은창이나오는데검색어에 sqlite 라고입력하고검색된결과 중에 libsqlite3.dylib 를선택하고 Add 를눌러라이브러리를추가한다.
왼쪽리스트에 libsqlite3.dylib 가추가된것을확인할수있다. 다음으로추가한라이브러리를어플소스에추가해보겠다. 왼쪽리스트에서 ViewController.h를선택하고아래의그림처럼 #import <sqlite3.h> 를추가한다. 그리고 ViewController.h 에아래와같이소스를추가한다.
sqlite3 *db" 는 sqlite3_stmt *statement 는 NSMutableArray *arraystr 은 DB 의내용이배열형태로저장되는곳이다. -(void)checkandcopydb; 는 sqlite파일이수정가능한폴더에복사되어있는지확인및복사하는메소드다. -(void)opendb; 는어플에서 DB에접근하기위해커넥션을맊드는메소드이다. -(NSString *)filepath; 는 sqlite파일이수정가능한폴더의위치값을반홖하는메소드이다. -(void)getdb; 는 sqlite파일에들어있는값을가져오는메소드이다. 이제 ViewController.m 으로넘어가서실제동작하는소스를작성해보자. 아래의그림처럼메소드폼을작성하자.
그런다음아래와같이메소드의동작내용을작성한다. 각각의소스에대한설명은다음과같다. -(void)checkandcopydb { NSFileManager *filem = [NSFileManager defaultmanager]; // 파일의유무를검사하기위해디폴트파일메니저를생성한다. if([filem fileexistsatpath:[self filepath]]) return; //[self filepath] 를실행하면 sqlite파일이수정가능한폴더의경로가나오는데그경로에 sqlite파일이존재하면참, 아니면거짓을반홖한다. NSString *pathsrc = [[NSBundle mainbundle] pathforresource:@ testdb oftype:@ sqlte ]; // 어플이실행되면파일이생성되는경로이다. } [filem copyitematpath:pathsrc topath:[self filepath] error:nil]; // 파일메니저를이용하여 pathsrc [self filepath] 로파일을복사한다. [filem release]; // 파일메니저멤버를메모리에서해제한다.
-(void)opendb { //sqlite를사용하기위해커넥션을생성하는부분이다. if(sqlite3_open([[self filepath] UTF8String], &db)!= SQLITE_OK) { } } -(NSString *)filepath { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentdir = [paths objectatindex:0]; return [documentdir stringbyappendingpathcomponent:@ testdb.sqlite ]; // 반홖되는결과는어플아이디 /Document/testDB.sqlite 이다. // 어플아이디 /Document에있는파일은수정이가능하다. } -(void)getdb { NSString *query = @ select * from table_test ; [self opendb]; //sqlite를사용하기위해 opendb메소드를사용한다. arraystr = [NSMutableArray arraywithcapacity:0]; // DB내용을저장하기위해 NSMutableArray를선언하고사이즈 0을준다.
if(sqlite3_prepare_v2(db, [query UTF8String], -1, &statement, NULL) == SQLITE_OK) // sqlite 사용준비가되면 SQLITE_OK값이된다. { while(sqlite3_step(statement) == SQLITE_ROW) { // 한줄한줄씩 DB를읽어낸다. NSString *str = [[NSString alloc] initwithutf8string:(char *)sqlite3_column_text(statement, 0)]; // 0 컬럼 ( 첫번째 ) 의값을 text형태로받아저장한다. [arraystr addobject:str]; //NSMutableArray에 DB값을저장한다. [str release]; } } for(int a = 0 ; a < [arraystr count] ; a++) // 배열젂체를출력하는부분이다. } else{ // sqlite 사용준비가안되면에러메시지를출력한다. } 그런다음 viewdidload 에아래와같이두가지를추가하여 sqlite 파일의위치를확인하 고 DB 내용을가져온다. 여기까지맊작성하고실행을해도 sqlite 파일에있는값을가져온다. Command + B, R 을눌러서실행해보아도좋다.
Step3. 버튼을누를때 DB 에값을넣고전체내용출력하기! 아래의그림처럼두부분에코드를추가한다. 그리고 Command + B, R 을눌러어플을실행해보자 아니면좌측상단의 Run 을눌러도실행된다.
어플이실행되면다음과같은내용이출력된다. 마지막라인을제외하고는어플이생성될때마다다른값을보여준다. 여기서설명을하자면첫번째라인 filepath : ---- 는 [self filepath] 를실행한결과이다. 여기에 sqlite파일이있을경우수정가능하다. 두번째라인 pathsrc : ---- 는어플이실행될때 sqlite파일이위치하는경로이다. 여기서는읽기맊가능하며접근시 mainbundle로접근하여야한다. 세번째라인은 testdb.sqlite파일에들어있는값이다. 이상으로 sqlite 다루기를마치겠다.