Cocoa 使用SQLite3 db的应用程序包括在雪豹上撞车
我已经在cocoa应用程序中包含了sqlite3db,它来自Leopard系统,并从中保存和检索了一些数据 问题是——虽然它在豹子身上运行良好,但它却在雪豹身上撞坏了 事故报告的部分内容如下:Cocoa 使用SQLite3 db的应用程序包括在雪豹上撞车,cocoa,sqlite,Cocoa,Sqlite,我已经在cocoa应用程序中包含了sqlite3db,它来自Leopard系统,并从中保存和检索了一些数据 问题是——虽然它在豹子身上运行良好,但它却在雪豹身上撞坏了 事故报告的部分内容如下: Process: RCS [84283] Path: /Volumes/RCS Project/~RCS APPLICATIONS/~RCS (Macintosh)/2011/26-January 2011/RCS.app/Contents/MacOS/RCS Ide
Process: RCS [84283]
Path: /Volumes/RCS Project/~RCS APPLICATIONS/~RCS (Macintosh)/2011/26-January 2011/RCS.app/Contents/MacOS/RCS
Identifier: com.tprf.RCS
Version: 2.0 build-0235 (2.0)
Code Type: X86 (Native)
Parent Process: launchd [173]
Date/Time: 2011-01-04 07:51:59.950 -0800
OS Version: Mac OS X 10.6.5 (10H574)
Report Version: 6
Interval Since Last Report: 494528 sec
Crashes Since Last Report: 24
Per-App Interval Since Last Report: 25 sec
Per-App Crashes Since Last Report: 2
Anonymous UUID: A9023F03-79EA-4444-B7BF-25AB6DD07985
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Application Specific Information:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Failed to open database'
*** Call stack at first throw:
(
0 CoreFoundation 0x947e76ba __raiseError + 410
1 libobjc.A.dylib 0x9182e509 objc_exception_throw + 56
2 CoreFoundation 0x947e73e8 +[NSException raise:format:arguments:] + 136
3 Foundation 0x913e6bb3 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
4 RCS 0x002af73c -[LocalDBController openDB] + 214
5 RCS 0x00075157 -[SplashScreen awakeFromNib] + 32
6 CoreFoundation 0x9477f9b4 -[NSSet makeObjectsPerformSelector:] + 196
7 AppKit 0x94d2721c -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1566
8 AppKit 0x94d251f4 loadNib + 257
9 AppKit 0x94d245ed +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 228
10 AppKit 0x94d244fe +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] + 158
11 AppKit 0x94d24449 +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 383
12 AppKit 0x94d2124d NSApplicationMain + 434
13 RCS 0x00002ce6 start + 54
)
Thread 0 Crashed: Dispatch queue: com.apple.main-thread
0 com.apple.CoreFoundation 0x94832a37 ___TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION___ + 7
1 libobjc.A.dylib 0x9182e509 objc_exception_throw + 56
2 com.apple.CoreFoundation 0x947e73e8 +[NSException raise:format:arguments:] + 136
3 com.apple.Foundation 0x913e6bb3 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
4 com.tprf.RCS 0x002af73c -[LocalDBController openDB] + 214
5 com.tprf.RCS 0x00075157 -[SplashScreen awakeFromNib] + 32
6 com.apple.CoreFoundation 0x9477f9b4 -[NSSet makeObjectsPerformSelector:] + 196
7 com.apple.AppKit 0x94d2721c -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1566
8 com.apple.AppKit 0x94d251f4 loadNib + 257
9 com.apple.AppKit 0x94d245ed +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 228
10 com.apple.AppKit 0x94d244fe +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] + 158
11 com.apple.AppKit 0x94d24449 +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 383
12 com.apple.AppKit 0x94d2124d NSApplicationMain + 434
13 com.tprf.RCS 0x00002ce6 start + 54
我在开始初始化和打开db时调用的方法如下:
-(void)dbInit{ // call in awake from NIB
databaseName = [[NSString alloc] initWithString:@"test10.sql"];
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
databasePath = [[NSString alloc] initWithString:[documentsDir stringByAppendingPathComponent:databaseName]];
NSLog(@"databasePath - %@",databasePath);
[self checkAndCreateDatabase];
}
-(void)checkAndCreateDatabase{
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
success = [fileManager fileExistsAtPath:databasePath];
NSLog(@"checkAndCreateDatabase, success - %d",success);
if(success){
[self openDB];
return;
}
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
[fileManager release];
// opening db
[self openDB];
}
- (void)openDB{
if (sqlite3_open([databasePath UTF8String], &database) != SQLITE_OK)
{
sqlite3_close(database);
NSAssert(0, @"Failed to open database");
}
else{
NSLog(@"db successfully opened");
}
}
有人能为它提出一些解决方案吗?找到了解决方案。我把它作为答案贴了出来
现在有一些疑问:
Miraj我想到的唯一问题是,您无意中使用了一组糟糕的sqlite库。检查您的系统是否有它们的任何实例,甚至静态链接它们?如果不是这样,我看不出有什么不对。(我假设数据库在别处被声明并设置为nil。)为了解决上面报告的问题,我尝试记录从sqlite3\u open返回的结果。我得到了14个。我检查了目录权限,发现有些权限不是读写权限。当我将all改为read&write时,它开始正常工作:)在提供答案之前,我有一些问题。1) 您是在使用系统中包含的SQLite3,还是在添加最新版本的SQLite3?使用fmdb作为SQLite3的包装器怎么样?关于:1)我正在使用系统中包含的SQLite3。。没有添加SQLite3的最新版本。您能建议我如何检查系统是否包含错误的sqlite库集吗?打开终端并使用“find/-name libsqlite*”,这将显示存在哪些版本。您可能需要安装最初在其上开发数据库的相同版本。