Ошибка («EXC_BAD_ACCESS») при попытке открыть (создать) SQLite d / b - PullRequest
1 голос
/ 27 апреля 2011

Вот код ... кто-нибудь видит, что не так?Кроме того, почему 2-й NSLog «errmsg» вызывает сбой отладчика при отладке на устройстве (iPhone 3GS)

    // Get the path to the database file
NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [searchPaths objectAtIndex:0];
NSString *databasePath = [documentPath stringByAppendingPathComponent:@"ppcipher.s3db"];
const char *cDatabasePath = [databasePath cStringUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"databasePath: %@", databasePath);

    NSString *sqlCommand = @"CREATE TABLE CardData (card_id TEXT PRIMARY KEY NOT NULL, card_name TEXT NOT NULL, "
        @"card_type TEXT, cide_val TEXT, create_date TEXT DEFAULT CURRENT_DATE, user_notes TEXT, gps_loc TEXT)"; 
    const char cSQLCommand = [sqlCommand cStringUsingEncoding:NSUTF8StringEncoding];
    char * errmsg = NULL;   

    NSFileManager *fileManager = [NSFileManager defaultManager];
    [fileManager removeItemAtPath:databasePath error:NULL];  //  <------------  delete d/b  TESTING ONLY! 

    BOOL fileExists = [fileManager fileExistsAtPath:databasePath];
    if(!fileExists)  {
        if(sqlite3_open(cDatabasePath, db) == SQLITE_OK) { // doesn't exist, so create it...
            sqlite3_exec(db, &cSQLCommand, NULL, NULL, &errmsg);  //  now create the table...
            NSLog(@"error: %@", errmsg);
        }

1 Ответ

2 голосов
/ 27 апреля 2011

Это сбой, потому что errmsg не является объектом Objective-C, который вам требуется при использовании замены %@.errmsg - это char *, что означает, что вы должны использовать %s.

Что касается причины сбоя ....

sqlite3_open определяется как:

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

Ваш db объявлен как sqlite3*.Другими словами, вы передаете не то, что нужно. Вы должны делать следующее:

sqlite3_open(cDatabasePath, &db)

Хотя ваше желание понять API SQLite C велико, я все же думаю, что вам следует использовать FMDB.Это действительно уменьшает такие ошибки и позволяет вам сосредоточиться на реальных проблемах с вашим кодом.

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