2011-01-05 5 views
0

私は、SQLite3 dbをLeopardシステムからココアアプリケーションに組み込み、そこからいくつかのデータを保存および取得しました。Snow LeopardでSQLite3 dbをクラッシュさせたアプリケーション

問題は - 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を格納すべきで任意の-他のフォルダがあります...文書以外の..私は〜/ライブラリに保存しなければなりません/アプリケーションサポート/または他のフォルダ?

  2. 私たちのコードで確認できますか?dbファイルを格納しているフォルダには適切な権限がありますか?

  3. フォルダに適切な権限がない場合は、コードで変更できますか?

これらの疑問を解決したり、私の要件を実装する標準的な方法を教えてもらえますか?

おかげで、

Miraaj

+0

1)システムに含まれているSQLite3を使用していますか、またはSQLite3の最新リリースを追加していますか? SQLite3のラッパーとしてfmdbを使うのはどうですか? –

+0

に関して:1)システムに含まれているSQLite3を使用しています。SQLite3の最新リリースを追加していません。 – Devarshi

答えて

0

上記の問題を解決するために、sqlite3_openから返された結果をログに記録しようとしました。私は14を得たie。 SQLITE_CANTOPEN。ディレクトリのアクセス許可を確認したところ、一部のアクセス許可が読み取られていないことが判明しました&私がすべて&を読むように変更したとき、それは正常に動作し始めました:)答えを提供する前に、私はいくつかの質問があります:

0

私が考える唯一の問題は、あなたが誤ってsqliteのライブラリの悪いセットを使用していることです。システムのインスタンスがないかどうかチェックしてください。そうでなければ、私は間違ったことは見ない。 (私はデータベースが宣言され、他の場所には何も設定されていないと仮定しています)。

+0

システムにsqliteライブラリの不正なセットが含まれているかどうかを確認する方法を教えてください。 – Devarshi

+0

端末を開き、 "find/-name libsqlite *"を使うと、どのバージョンが存在するかがわかります。最初にデータベースを開発したのと同じバージョンをインストールする必要があります。 – SilverbackNet

関連する問題