'XCode 4.2'에 해당되는 글 1건

  1. 2012.07.22 xCode 4.2 에서 SQLite사용하기 (1)

xCode 4.2 에서 SQLite 사용하기

   - xCode 4.2 에는 Resources 폴더가 없습니다.

     (프로젝트 선택한 후 Build-Phases탭 아래쪽의 Copy Bundle Resources에 만들어 놓은 db추가 해야 합니다.)

   - 이미 만들어져 이는 db.sqlite를 불러서 NSLog();를 통해 확인해 보는 예제입니다.

   - Document에 db.sqlite 파일 복사하는 부분 넣지 않으니까 결과가 안나오더군요...

 

//
//  AppDelegate.m
//  dbtest002
//
//  Created by ChanSeob Lee on 12. 7. 17..
//  Copyright (c) 2012년 __MyCompanyName__. All rights reserved.
//

#import "AppDelegate.h"
#import <sqlite3.h>

@implementation AppDelegate

@synthesize window = _window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   
    NSString *databaseName = @"db.sqlite";

    //도큐먼트 디렉토리 위치를  얻는다.
    NSString* documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];    
    
    //도큐먼트 위치에 db.sqlite명으로 파일패스 설정
    NSString *filePath = [documentDirectory stringByAppendingPathComponent:databaseName];

    NSFileManager *fileManager = [NSFileManager defaultManager];
   
    // 도큐먼트에 .sqlite 파일 복사
    BOOL dbexits = [fileManager fileExistsAtPath:filePath];
    if (!dbexits) 
    {
        NSString *defaultDBPath = [[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:databaseName];
        NSError *error;
       
        BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:filePath error:&error];
        if (!success) {
            NSAssert1(0,@"Failed to create writable database file with message '%@'.", [error localizedDescription]);
        }
    }    
    
    // 데이터베이스를 연결한다. 해당 위치에 데이터베이스가 없을경우에는 생성해서 연결한다.
    sqlite3 *database;
    if (sqlite3_open([filePath UTF8String], &database) != SQLITE_OK) {
       
        sqlite3_close(database);
       
        NSLog(@"Error");
    }
    
    
    // 테이블 생성
    char *sql = "CREATE TABLE IF NOT EXISTS test (no INTEGER PRIMARY KEY NOT NULL, name VARCHAR)";
   
    if (sqlite3_exec(database, sql, nil,nil,nil) != SQLITE_OK) {
       
        sqlite3_close(database);
       
        NSLog(@"Error");
    }
    
   
//    // 삽입 및 갱신
//    sqlite3_stmt *insertStatement;
//    char *insertSql = "INSERT or REPLACE INTO test (no,name) VALUES(?,?)";
//   
//    //프리페어 스테이트먼트를 사용
//    if (sqlite3_prepare_v2(database, insertSql, -1, &insertStatement, NULL) == SQLITE_OK) {
//       
//        //?에 데이터를 바인드
//        sqlite3_bind_int(insertStatement, 1, 1);
//        sqlite3_bind_text(insertStatement, 2, [@"홍길동" UTF8String],  -1, SQLITE_TRANSIENT);
//       
//        // sql문 실행
//        if (sqlite3_step(insertStatement) != SQLITE_DONE) {
//            NSLog(@"Error");
//           
//        }
//    }
    
   // select
    sqlite3_stmt *selectStatement;
   
    char *selectSql = "SELECT no, name FROM test";
   
    if (sqlite3_prepare_v2(database, selectSql, -1, &selectStatement, NULL) == SQLITE_OK) {
        
        // while문을 돌면서 각 레코드의 데이터를 받아서 출력한다.
        while (sqlite3_step(selectStatement)==SQLITE_ROW) {
            int no = sqlite3_column_int(selectStatement, 0);
            NSString *name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectStatement, 1) ];
            NSLog(@"no : %i, name : %@",no,name);
        }          
    }       
    
//statement close
//    sqlite3_finalize(insertStatement);
    sqlite3_finalize(selectStatement);
    
    //db close
    sqlite3_close(database);
     
    [_window makeKeyAndVisible];
    return YES;
}


@end

저작자 표시 비영리 변경 금지
신고
Posted by 천왕지짐