2012-01-10 1 views
1

Xcode를 처음 접하고 나 자신을 배우려고 노력하면서 문제는 순진하지만 실제로 도움이 필요합니다. 소스 코드로 완성 된 프로젝트를 통해 전자 책을 만드는 법을 배우고 있습니다. sqlite3을 통해 책갈피를 완벽하게 기록합니다. 그러나 다른 이름과 경로를 가진 새 프로젝트를 만들 때 libsqlite3.dylib의 pharse를 올바르게 작성하고 거의 모든 코드를 복사하면 책갈피 창을 방문하려고 할 때 else 문이 호출되고 충돌이 발생합니다.sqlite3을 처음 사용하다가 마침내 수천 가지 방법으로 문제를 해결해 보았습니다.

여기에 내가 나 자신에게 물었다 몇 가지 질문,

  1. 가 난 아무것도 그리워했던, 또는 이름이나 경로 변경에 실패이야? 대답했다 : 아니오.
  2. 하나가 완벽하게 실행되고 거의 동일한 코드가 충돌하는 다른 오류는 가장 큰 오류일까요? 대답 :이 두 프로젝트 등 경로, 이름, 파일의 내용과 매우 다른 점.

그런 다음 좋은 프로젝트의 데이터베이스 파일 이름을 변경했는데 충돌이 발생합니다. 내가 존재하지 않는다면, sqlite3_open([dbPath UTF8String], &dataBase);이 파일을 생성한다고 들었 기 때문에 믿을 수가 없었습니다. 새 파일에 액세스하라는 메시지가 나오면 왜 새 이름으로 새 파일을 만들지 않습니까?

두 번째 테스트에서는 새 프로젝트의 db 파일 경로를 원래 파일의 db 파일 경로로 수동으로 변경했습니다. 경로는 더 이상 [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];이지만 @/"/ Users/~ (원래 경로) ~/Documents/archive"이고 omg는 작동합니다. 물론 나는 그 경로가 실제 아이폰에는 아무런 의미가 없으며 여전히 원본 파일의 db 파일에 의존하기 때문에 그대로 둘 수는 없습니다.

적어도 경로가 중요하다는 것을 알고 있으며 내 새 프로젝트에서 db 파일과 같은 것이 누락 된 것 같습니다. 하지만 원래 프로젝트의 경로에 db 파일을 찾지 못했지만, 존재하고 중요하게 보이지만 파인더에서는 표시되지 않습니다.

필자는 [self createEditableCopyOfDatabaseIfNeeded]를 호출하는 것과 같이 파일을 내 새 경로 programaticlly에 복사하려고했습니다. 새로운 길과 오래된 길. 그게 제가 지금까지 시도한 전부입니다.

이상한 일은 알 수없는 시도 후에 글꼴과 색을 어떻게 든 기록하지만 책갈피 창으로 이동하면 여전히 충돌합니다.

3 일 만에 내가 시도한 것입니다. 질문에 대답하거나 적어도 수천 번의 시도 후에 내가 어떻게 화가 났는지 알 수 있습니다. 도움을 기다리고 고맙습니다.

const char * createSQL = "BOOKMARK (POS REAL PRIMARY KEY, \ fontsize REAL, \ bookpath TEXT)가 존재하지 않으면 테이블 만들기";

새로 추가 : 데이터베이스가 준비되지 않았을 때 프로그램이 자동으로 충돌을 일으키기 때문에 누군가가 말한 것처럼 meg는 쓸모가 없습니다. 내가 필요로하는 것은 아마 거짓말이 아닌 sqlite3_prepare(dataBase, [querySQL UTF8String], -1, &statement, nil) == SQLITE_OK을 만드는 것이다.

+1

정확히 어디에서 오류가 발생하며 어떤 오류 메시지가 표시됩니까? 프로젝트에 데이터베이스 파일을 추가 했습니까? – user371320

+0

런타임에 표시되는 오류 메시지를 제공하십시오. –

+0

상기시켜 주셔서 감사합니다! 오류 메시지가 추가되었습니다. –

답변

0

새 DB에서 테이블을 만드는 데 사용중인 SQL이 엉망으로 보입니다.의 \ '의

대신이 시도 제거해보십시오 :

const char *createSQL = "CREATE TABLE IF NOT EXISTS BOOKMARK(pos REAL PRIMARY KEY, fontsize REAL, bookpath TEXT)"; 

은 또한 당신이 sqlite3_prepare 실제로 반환 무엇인지 살펴 보셔야합니다. SQLite 문서는 확인을 위해 error codes의 목록을 제공합니다. 오류 코드 기록의 예 :

int ret = sqlite3_prepare(dataBase, [querySQL UTF8String], -1, &statement, nil); 
if (ret != SQLITE_OK) { 
    NSLog(@"Error calling sqlite3_prepare: %d", ret); 
} 
+0

놀란 대답. 나는 실행 코드 인 클래스가 정확하지 않을지도 모른다고 배웠다. 나는 /가 초과하지 않았 음을 가정해서는 안됩니다. 그러나 필자는 코드를 한 번 실행 한 후에 코드를 변경 한 적이 전혀 없다고 생각하지 않았습니다. 폴더의 고유성에 중점을 두었습니다. 나는 심지어 두 줄의 나쁜 코드에 정확하게 초점을 맞추었다. 그러나 나는 회의주의가 부족합니다. 내 결론은 문제 자체가 아닌 문제로 생각하는 것입니다. 가장 어려운 대답이 가장 쉬워야합니다. –

0

errorMsg에 기록 된 값을 왜 출력하지 않습니까? 적어도 데이터베이스를 만들지 않는 이유는 무엇인지 알려줄 것입니다.

NSLog (@ "% @", [NSString stringWithUTF8String : errorMsg]);

+0

감사합니다. 더 자세히 알려주시겠습니까? 어떤 방법을 쓰고 어떤 선을 삽입해야합니까? –

+0

다음과 같은 행이 있습니다. int ret = sqlite3_exec (dataBase, createSQL, NULL, NULL 및 errorMsg); 이미이 줄에 errorMsg가 표시됩니다. NSLog를 추가하여 콘솔에 출력하십시오. –

관련 문제