SQLite: ошибка БД, «недостаточно памяти» - PullRequest
3 голосов
/ 05 мая 2011

Я использую FMDB для создания и добавления записи в ad / b.Метод создания d / b:

//-----------------------    checkIfDatabaseExists    -----------------|
+ (void) openCreateDB  {

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

    char * errmsg = nil;   

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

    BOOL fileExists = [fileManager fileExistsAtPath:databasePath];
    if(!fileExists)  {
        FMDatabase* _db = [FMDatabase databaseWithPath: databasePath]; 

        if (![_db open]) {
            NSLog(@"Could not open/create database");
        }

        [_db executeUpdate:@"CREATE TABLE CardData (card_id TEXT PRIMARY KEY NOT NULL, card_name TEXT NOT NULL, "
         @"card_type TEXT, code_val TEXT, create_date TEXT DEFAULT CURRENT_DATE, user_notes TEXT, gps_loc TEXT)"];

        if(errmsg != nil)
            NSLog(@"error: %s", errmsg);  //  DEBUGGING ONLY!  (REMOVE when done!)
    }
    return;
}

, который не вызывает ошибок.Однако, когда я в следующий раз делаю одну (1) «вставку» после «открытия», я получаю ошибку от FMDB, говорящую об ошибке БД: 7 «недостаточно памяти».И каждый SQL-оператор после этого я получаю ту же ошибку (только создание d / b не дало ошибок!).Вот код для вставки:

//---------------------    addRecordToDatabase    ----------------------|
+ (void)addRecordToDatabase: (ZBarSymbol *)symbol  {


    FMDatabase* _db = [FMDatabase sharedFMDatabase];

    [_db setLogsErrors:1];  //  log all of the SQLite d/b errors

    [_db executeUpdate: @"INSERT INTO CardData (card_id, card_name, code_val) VALUES (?, ?, ?)", symbol.data, @"Test Card", symbol.typeName, nil];

}

Это очень маленький д / б с минимальными данными.Я управлял Инспектором, и ничего не было необычным.Любые предложения будут с благодарностью.

1 Ответ

18 голосов
/ 05 мая 2011

Я думаю, вы должны просто позвонить [_db open] в своем коде, это должно исправить это.Кажется, что «ошибка нехватки памяти» в FMDB означает также ошибку, вызванную отсутствием таблиц или неустановленным соединением.

...