FMDB - не удалось изменить базу данных из какао - PullRequest
1 голос
/ 27 октября 2011

Я работаю над приложением Какао, которое взаимодействует с локальной базой данных SQLite с помощью FMDB.Я столкнулся с проблемой, что я не могу выполнить операцию вставки или обновления в БД.Запросы на выбор выполняются отлично, поэтому я предполагаю, что мои настройки соединения с БД верны.

Структура моего кода в основном такая:

FMDatabase* db=[FMDatabase databaseWithPath:[[NSBundle mainBundle] pathForResource:@"DBName" ofType:@"sqlite"]];

if(![db open])
{
  NSLog(@"Could not open db.");
}

db.traceExecution=YES;
[db beginTransation];
[db ExecuteUpdate:"INSERT INTO test (title) VALUES(?)", [NSNumber numberWithInt]:2],nil];
[db commit];
[db close];

Во время выполнения не было выдано никаких исключений или предупреждений.вывод консоли относительно db.traceExecution выглядит следующим образом:

<FMDatabase: 0x100511fd0> executeUpdate: BEGIN EXCLUSIVE TRANSACTION;
<FMDatabase: 0x100511fd0> executeUpdate: INSERT INTO test (title) VALUES(?);
obj: 2
<FMDatabase: 0x100511fd0> executeUpdate: COMMIT TRANSACTION;

База данных тестирования - это просто таблица из одного столбца типа INT.

Все выглядит хорошо, за исключением того, что файл dbне обновляется вообще.Это действительно сбивает с толку меня, так как запрос Select работает отлично.Я проверил путь к базе данных, он указывает на правильный.Сначала я подозреваю, что это вызвано разрешением файла, но проблема остается той же, даже если я позволил всем иметь возможность чтения / записи.

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

1 Ответ

1 голос
/ 27 октября 2011

Базы данных в комплекте только для чтения.Если файл не существует в папке назначения, где вы определяете, вы должны скопировать его из пакета в папку библиотеки или документов, а затем подключиться к нему.Это означает, что он будет копироваться при первом использовании этого пути.

Вот функция для «подготовки» базы данных путем копирования ее в место назначения из пакета.Он копирует его в библиотеку (из моего приложения для iOS), но вы можете копировать, где вы хотите.В моем случае это были contacts.db.

Я вызвал этот метод из sureOpened.

- (BOOL)ensureDatabasePrepared: (NSError **)error
{
    // already prepared
    if ((_dbPath != nil) &&
        ([[NSFileManager defaultManager] fileExistsAtPath:_dbPath]))
    {
        return YES;
    }

    // db in main bundle - cant edit.  copy to library if !exist
    NSString *dbTemplatePath = [[NSBundle mainBundle] pathForResource:@"contacts" ofType:@"db"];
    NSLog(@"%@", dbTemplatePath);

    NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
    _dbPath = [libraryPath stringByAppendingPathComponent:@"contacts.db"];

    NSLog(@"dbPath: %@", _dbPath);

    // copy db from template to library
    if (![[NSFileManager defaultManager] fileExistsAtPath:_dbPath])
    {
        NSLog(@"db not exists");
        NSError *error = nil;
        if (![[NSFileManager defaultManager] copyItemAtPath:dbTemplatePath toPath:_dbPath error:&error])
        {
            return NO;
        }

        NSLog(@"copied");
    }    

    return YES;    
}
...