Приложение с базой данных SQLite3 включает сбой на Snow Leopard - PullRequest
0 голосов
/ 05 января 2011

Я включил 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 ...кроме документов ... я должен сохранить его в ~ / Library / Application Support / или в любой другой папке?

  2. Можем ли мы проверить это с помощью нашего кода в той папке, в которой мы хранимФайл БД имеет соответствующие разрешения или нет?

  3. Если папка не имеет соответствующих разрешений, можем ли мы изменить ее с помощью кода?

Может кто-нибудь очиститьэти сомнения или подскажите мне стандартный способ реализации моих требований?

Спасибо,

Miraaj

Ответы [ 2 ]

0 голосов
/ 06 января 2011

Чтобы решить проблему, описанную выше, я попытался записать результат, возвращенный из sqlite3_open.Я получил 14 т.е.SQLITE_CANTOPEN.Я проверил разрешение каталога и обнаружил, что некоторые разрешения не были доступны для чтения и записи.Когда я изменил все на чтение и запись, он начал работать правильно:)

0 голосов
/ 05 января 2011

Единственная проблема, о которой я думаю, это то, что вы случайно используете неверный набор библиотек sqlite.Проверить вашу систему на наличие каких-либо их экземпляров или даже статически связать их?Если это не так, я не вижу ничего плохого.(Я предполагаю, что база данных объявлена ​​и установлена ​​в ноль в другом месте.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...