Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- Xcode
- storyboard
- NSHomeDirectory
- CCLOG
- Derived Data
- box2d
- scale
- UIView
- SBTarget
- cocos2d-x
- Undefined symbols for architecture armv7s
- 태그를 입력해 주세요.
- landscape
- ccbi
- release
- /var/mobile/Applications
- Default-568h.png
- .svn
- xib
- 멀티태스킹
- Debug
- LLVM
Archives
- Today
- Total
standwally
sqlite3 .db 파일 사용시 유의사항 본문
기존에 .app 또는 .apk 파일안에 .db파일이 들어있을 경우에
DB 테이블에 칼럼 데이터를 수정하고자하면,
"Attempt to write a readonly database"
위와 같은 파일 접근 문제로 인한 sqlite3의 에러 메세지를 경험했을 것이다.
그래서 보통 .db파일과 같은 앱에 포함된 리소스 파일을 읽기/쓰기가 가능한 영역으로 복사해서 사용을 한다.
Cococs2d-x에서도 동일한 현상으로 인해 동일한 방법으로 .db 파일을 복사해서 사용하려 했으나,
도무지 적용이 안된다.
해결방법은,
앱에 포함된 .db 파일의 확장자를 .mp3로 수정해서 포함시킨 다음에, 파일 데이터를 가져와서 다시 .db파일로 쓰기를 하면 정상적으로 모든 테이블과 데이터들이 살아있다.
소스는 아래를 참고바람.
std::string writeablePath = CCFileUtils::sharedFileUtils()->getWritablePath(); writeablePath += "data.db"; if (CCFileUtils::sharedFileUtils()->isFileExist(writeablePath.c_str()) == false) { std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename("data.mp3"); // 실제 파일의 속성은 .db이지만 확장자만 .mp3로 바꿔서 앱의 리소스 폴더에 포함시킨 파일임. unsigned long tmpSize; unsigned char* sqlData = CCFileUtils::sharedFileUtils()->getFileData(path.c_str(), "rb", &tmpSize); FILE *fp = fopen(writeablePath.c_str(), "wb"); if (!fp) { return false; } fwrite(sqlData, tmpSize, 1, fp); fclose(fp); }