2012-08-08 9 views
1

내 앱이 Mountain Lion (SQLite 3.7.12)에 새로운 핵심 데이터 저장소를 만드는 경우 동일한 앱이 Tiger (SQLite 3.1.3)에서 파일을 열려고 할 때 NSPersistentStoreInvalidTypeError 오류가 발생합니다. Tiger Mac에서 sqlite3 명령 줄 도구를 실행해도 데이터베이스를 열 때 오류가 발생하지 않지만 ".dump"명령은 SQLite에서 비어 있다고 생각한다는 것을 보여줍니다.Core Data SQLite가 OS X 10.8에서 10.4로 역 호환되지 않는 이유는 무엇입니까?

그러나 데이터베이스가 Tiger에서 작성된 경우 Mountain Lion에서 편집 한 다음 Tiger에서 아무 문제없이 다시 편집 할 수 있습니다.

Mountain Lion에서 뭔가 변경되어 새로 만든 영구 저장소가 더 이상 이전 버전과 호환되지 않겠습니까? 아니면 사용할 수있는 설정이 있습니까? 필자가 아는 한, 3.1.3에 없었던 write-ahead 로깅과 같은 새로운 SQLite 기능을 사용하지 않습니다. 또한 라이온스에서 만든 데이터베이스에는 문제가 없었습니다.

업데이트 : SQLite change history은 버전 3.7.10에서 파일 형식이 변경되었음을 보여줍니다. 당신은 PRAGMA legacy_file_format=ON을 설정할 수 있어야됩니다

이 플래그가 켜져, 새로운 SQLite 데이터베이스는 SQLite는 3.0.0로 다시 가는 모든 버전에서 읽고 쓸 수있는 파일 형식으로 작성됩니다.

이것은 나를 위해 sqlite3를 직접 사용합니다. 그러나 NSSQLitePragmasOption 옵션을 통해 NSPersistentStoreCoordinator으로 설정하면 무시되는 것으로 보입니다. Tiger의 sqlite3은 데이터베이스를 다시 비어있는 것으로 간주합니다.

답변

1

처음에는 용어 문제입니다. Wikipedia에 따르면, 당신이 여기서 말하는 이슈는 forward compatibility이라고 생각합니다 : "앞으로의 호환성은 디자인이 자신의 최신 버전을위한 입력을 정상적으로 받아 들일 수있는 능력을 목표로합니다." 이 경우 OS X 10.4에서 릴리스 된 sqlite3 (3.1.3) 버전은 OS X 10.8의 최신 버전 sqlite3 (3.7.12)에서 생성 된 디스크상의 데이터 형식을 처리 할 수 ​​있습니까?

sqlite3 documentation에 따르면 sqlite3은 디스크 호환 형식이 완전히 호환 될 수 있고 제한 내에서만 이전 버전과 호환 될 것이라고 약속하지 않습니다. 즉, 최신 버전은 이전 버전에서 생성 된 데이터베이스를 읽을 수 있습니다. sqlite 셸을 사용하는 단순한 데이터베이스 생성 예제를 사용하여 간단하게 설명 할 수 있습니다. 10.4 버전으로 생성 된 데이터베이스는 10.8 버전에서 읽을 수 있지만 그 반대는 사실이 아닙니다. 내가 애플에서 제공하는 시스템 버전과 함께 sqlite3를의 최신 버전이 일어나는 10.4 기계 (PPC)가 발생합니다

데이터베이스에 생성 된 경우 같은 일이 발생
$ /macports/bin/sqlite3 -version 
3.7.13 2012-06-11 02:05:22 f5b5a13f7394dc143aa136f1d4faba6839eaa6dc 
$ /macports/bin/sqlite3 test.db <<EOF 
>  BEGIN TRANSACTION; 
>  CREATE TABLE t1 (t1key INTEGER 
>     PRIMARY KEY,data TEXT,num double,timeEnter DATE); 
>  INSERT INTO "t1" VALUES(1, 'This is sample data', 3, NULL); 
>  INSERT INTO "t1" VALUES(2, 'More sample data', 6, NULL); 
>  INSERT INTO "t1" VALUES(3, 'And a little more', 9, NULL); 
>  COMMIT; 
> EOF 
$ /macports/bin/sqlite3 test.db "select * from t1 limit 2"; 
1|This is sample data|3.0| 
2|More sample data|6.0| 
$ /usr/bin/sqlite3 test.db "select * from t1 limit 2"; 
SQL error: unsupported file format 
$ /usr/bin/sqlite3 -version 
3.1.3 

10.8로 이동 한 다음 10.4로 이동했습니다. 10.7 버전의 sqlite3 (3.7.7)을 사용하여 동일한 테스트를 실행하는 경우 10.4 버전 은 데이터베이스 파일을 읽을 수있는입니다. 포맷이 오랫동안 호환성을 유지하는 것은 이제 막 행운이라고 생각합니다. 이제 행운이 다 된 것 같습니다. 애플이 CoreData SQL 데이터베이스가 OS X 릴리스의 범위에서 포워드 호환 가능하다고 보증하지 않는다면, 애플리케이션 내에서 이러한 종류의 호환성을 처리 할 필요가있을 것이다. 예를 들어, 데이터베이스를 덤프 및 재 작성 버전.

+0

답변 해 주셔서 감사합니다. 나는 당신이 용어에 대해 옳다고 생각합니다. 필자가 아는 한, Apple은 보증을하지 않았지만 정상적으로 작동하는 방식은 Apple이 무언가가 망가질 때 명시 적으로 알려줍니다.NSPropertyListSerialization 또는 NSKeyedArchiver가 갑자기 형식을 변경하면 혼란이있을 것입니다. 나는 그들이 약속 한 것으로 믿는 SQLite 형식 호환성에 관한 정보로 질문을 업데이트했다. –