【问题标题】:Application with SQLite3 db included crashing on Snow Leopard使用 SQLite3 db 的应用程序包括在 Snow Leopard 上崩溃
【发布时间】:2011-01-06 17:28:45
【问题描述】:

我已将 SQLite3 db 包含在一个可可应用程序中,来自 Leopard 系统,并从中保存和检索一些数据。

问题是 - 虽然它在 Leopard 上运行良好,但在 Snow Leopard 上却崩溃了。

部分崩溃报告如下:

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

我在开始初始化和打开数据库时调用的方法如下:

-(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");
    }
}

任何人都可以提出一些解决方案吗?找到解决方案。我已将其发布为答案。


现在有一些疑问:

  1. 除了文档之外,还有什么其他文件夹可以存储 SQLite3 db... 我应该将其存储在 ~/Library/Application Support/ 或任何其他文件夹中吗?

    李>
  2. 我们能否通过代码检查存储 db 文件的文件夹是否具有适当的权限?

  3. 如果文件夹没有相应的权限,我们可以通过代码更改它吗?

谁能解开这些疑惑或告诉我实现我的要求的标准方法?

谢谢,

米拉杰

【问题讨论】:

  • 在提供答案之前,我有一些问题。 1)您是使用系统自带的SQLite3,还是添加最新版本的SQLite3?使用 fmdb 作为 SQLite3 的包装器怎么样?
  • 关于:1)我正在使用系统中包含的 SQLite3 .. 没有添加最新版本的 SQLite3 ..

标签: cocoa sqlite


【解决方案1】:

我想到的唯一问题是您不小心使用了一组糟糕的 sqlite 库。检查您的系统是否有它们的任何实例,甚至静态链接它们?如果不是这样,我看不出有什么问题。 (我假设数据库在其他地方被声明并设置为 nil。)

【讨论】:

  • 你能建议我如何检查系统是否包含一组坏的 sqlite 库吗?
  • 打开一个终端并使用“find / -name libsqlite*”,它会告诉你存在哪些版本。您可能需要安装与最初开发数据库的版本相同的版本。
【解决方案2】:

为了解决上面报告的问题,我尝试记录从 sqlite3_open 返回的结果。我得到了 14 即。 SQLITE_CANTOPEN。我检查了目录权限,发现有些权限不是读写的。当我将所有内容更改为读写时,它开始正常工作:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多