2012-05-07 3 views
0

데이터베이스에 연결하려고하는데 경로를 NSBundle로 이동하면 성공적이지만 경로를 내 응용 프로그램의 문서 디렉토리에 넣으려고하면 성공하는 것으로 나타납니다. 그런 다음왜 NSBundle mainBundle이 작동하지만 documentsDirectory는 작동하지 않습니까?

NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

NSString* documentsDirectory = [paths lastObject]; 

NSString* databasePath = [documentsDirectory stringByAppendingPathComponent:@"tblStore.sqlite"]; 

:

NSString* databasePath = [[NSBundle mainBundle] pathForResource:@"tblStore" ofType:@"sqlite"]; 

이 줄을 주석되지 않으며, 위의 라인이 주석 처리되어 : 나는 선에서 주석

-(IBAction)setInput:(id)sender 
{ 
    NSString *strStoreNumber; 
    NSString *strRegNumber; 

    strStoreNumber = StoreNumber.text; 
    strRegNumber = RegNumber.text; 

    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString* documentsDirectory = [paths lastObject]; 
    NSString* databasePath = [documentsDirectory stringByAppendingPathComponent:@"tblStore.sqlite"]; 
// NSString* databasePath = [[NSBundle mainBundle] pathForResource:@"tblStore" ofType:@"sqlite"]; 

    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
    { 
     NSLog(@"Opened sqlite database at %@", databasePath); 
     sqlite3_exec(database, "CREATE TABLE IF NOT EXISTS tblStore (ID INTEGER PRIMARY KEY AUTOINCREMENT, Message TEXT)", NULL, NULL, NULL); 
     //...stuff 
    } 
    else 
    { 
     NSLog(@"Failed to open database at %@ with error %s", databasePath, sqlite3_errmsg(database)); 
     sqlite3_close (database); 
    } 
//  
    NSString *querystring; 

    // create your statement 
    querystring = [NSString stringWithFormat:@"SELECT strStore, strReg FROM tblStore WHERE strStore = %@ AND strReg = %@;", strStoreNumber, strRegNumber]; 

    const char *sql = [querystring UTF8String]; 

    NSString *szStore = nil; 
    NSString *szReg = nil; 

    sqlite3_stmt *statement = nil; 
    if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL)!=SQLITE_OK) //queryString = Statement 
    { 
     NSLog(@"sql problem occured with: %s", sql); 
     NSLog(@"%s", sqlite3_errmsg(database)); 
    } 
    else 
    { 
     // you could handle multiple rows here 
     while (sqlite3_step(statement) == SQLITE_ROW) 
     {    
      szStore = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 0)]; 
      szReg = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 1)]; 
     }   

    } 

    sqlite3_finalize(statement); 

    lblStoreNumber.text = szStore; 
    lblRegNumber.text = szReg; 
// 
} 

: 여기 내 코드입니다 그것은 잘 작동합니다. setInput에 방법에서와 같이 그 세 라인 (주석 처리되지 않은 경우, 나는 다음과 같은 오류를 얻을 :

2012-05-07 13:44:29.511 CCoDBTry[1981:f803] Opened sqlite database at /Users/Matt****/Library/Application Support/iPhone Simulator/5.1/Applications/5DB7A218-A0F6- 485F-B366-91FD2F9BC062/Documents/tblStore.sqlite 
2012-05-07 13:44:29.545 CCoDBTry[1981:f803] sql problem occured with: SELECT strStore, strReg FROM tblStore WHERE strStore = 8053 AND strReg = 4; 
2012-05-07 13:44:29.546 CCoDBTry[1981:f803] no such column: strStore 

이 명심,이 같은 데이터베이스 테이블에 액세스하고 나는를 사용할 때 잘 작동 NSBundle 논리. 내가 크게 여기에 대한 도움을 주셔서 감사합니다. 나는 완전히 NSBundle 및 documentsDirectory의 차이를 이해하지 인정,하지만 난 내 표는 내 응용 프로그램의 문서에 존재 할 것이라고 생각합니다.

감사합니다!

답변

2

NSBundle은 응용 프로그램 자체의 리소스에 액세스하는 데 사용됩니다. 즉, 모든 기능 ide YourApp.app. documentsDirectory은 앱 외부의 위치이며 앱 샌드 박스의 일부이며 Mac의 사용자 홈 디렉토리와 유사한 "홈 디렉토리"에 있습니다.

다른 위치이므로 다른 하위 경로에서 파일을 찾기 위해 하나를 사용하면 작동하지 않습니다.

+0

을 NSDocumentDirectory TO 왜합니까 strStore 열을 찾을 때 나는 DocumentsDirectory 작업에서 생성되지 경로? 열은 NSBundle 논리가 사용될 때 발견됩니다. 내 코드에 어떤 문제가 있는지 자세히 설명해 주시겠습니까? 목표는 iPhone의 문서 폴더에 내 sqlite 테이블의 경로를 만드는 것입니다. 나는 도청 당했고 여기에서 어떤 도움을 주시면 감사하겠습니다. 감사! – Skizz

1

무엇 @rickster 것은 말하고는 이것이다 : 당신은 엑스 코드에서 프로젝트에 SQLite는 데이터베이스를 추가하는 경우

  1. , 데이터베이스의 파일은 앱의 번들에 추가됩니다.
  2. 코드로 데이터베이스를 만드는 경우 해당 파일이 문서 디렉토리에 생성됩니다 (단 번들에없는 경우는).
  3. 두 위치는 으로 완전히으로 구분됩니다. 앱을 컴파일 할 때 번들이 생성되고 나중에 변경할 수 없습니다. 문서 디렉토리는 "샌드 박스"되어있어 액세스 할 수 있습니다. 여기에서 파일을 읽고 쓰거나 삭제할 수 있습니다. NSBUndle에서
+0

흥미 롭습니다. 따라서이 데이터베이스 테이블의 복사본을 내 문서 디렉토리에 저장하려면 코드를 통해 테이블을 만들어야합니다. 맞습니까? 응답 주셔서 감사합니다! – Skizz

+0

코드를 통해 문서를 추가하는 경우를 제외하고 문서 디렉토리에 파일을 추가하는 방법을 모르겠습니다. 나는 그것이 틀렸다면 나는 그것에 대해 시정되고 싶다. – mbm29414

+0

애플리케이션 번들에서 파일을 가져온 다음 NSFileManager를 사용하여 문서 디렉토리에 복사 할 수 있습니다. – rickster

1

복사

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                NSUserDomainMask, 
                YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"culinary-Info.sqlite"]; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
if(![fileManager fileExistsAtPath:path]) 
{ 
    NSString *bundle = [[NSBundle mainBundle] pathForResource:@"culinary-Info" ofType:@"sqlite"]; 
    [fileManager copyItemAtPath:bundle toPath:path error:nil]; 
} 
관련 문제