iOS — вставка базы данных FMDB

Чтобы вставить данные в базу данных с помощью sqlite, необходимо скопировать базу данных, чтобы сделать ее доступной для записи. Итак, у меня есть этот метод в моем классе, и каждое предложение, которое я видел, переполняет стек и многие другие сайты:

-(void)createEditableCopyOfDatabaseIfNeeded 
{  
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"sample.db"];

    success = [fileManager fileExistsAtPath:writableDBPath];

    if (success) return;
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"sample.db"];
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
        if (!success) {
            NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
        }

}

Конечно, у меня есть следующие коды для доступа к моей базе данных:

FMDatabase *db; = [FMDatabase databaseWithPath:[[NSBundle mainBundle] pathForResource:@"sample" ofType:@"db"]];
if (![db open]) {
    NSLog(@"Error!");
}
else {
    NSLog(@"Database opened!!");
}

[self createEditableCopyOfDatabaseIfNeeded];
[db executeUpdate:@"Insert into user (name, phone, comment) values(?, ?, ?)", @"Name1", @"13548", @"This is a comment", nil];
NSLog(@"Inserted");

FMResultSet *s = [db executeQuery:@"SELECT * FROM user"];
while ([s next]) {
    NSLog(@"%@", [s stringForColumn:@"comment"]);
}

Теперь у меня есть несколько вопросов:

  1. Код вставки отлично работал в симуляторе при выполнении/запуске. Однако это не повлияло на реальный файл sample.db, и я пришел к выводу, что он должен иметь доступную для записи копию где-то на жестком диске моего Mac. Это приемлемо. Но когда я запустил этот код на iphone, он несколько не распознал мой метод createEditableCopyOfDatabaseIfNeeded и выдал эту ошибку: Unknown error finalizing or resetting statement > (8: attempt to write a readonly database). Как заставить эти коды работать с помощью FMDB?

  2. При работе на iPhone, где будет располагаться копируемая база данных? После копирования iPhone снова использует эту базу данных, даже если он не подключен к моему Mac?

Я не могу что-то вставить при запуске на устройстве. Пожалуйста помоги.

Большое спасибо!


person ruelluna    schedule 11.04.2012    source источник
comment
1. вы не можете редактировать/обновлять/изменять файлы, которые находятся в вашем AppBundle, вам нужно создать базу данных в вашем каталоге документов.   -  person CarlJ    schedule 11.04.2012
comment
да, и я рекомендую использовать FMDatabase или CoreData (событие лучше) с SQLite   -  person CarlJ    schedule 12.04.2012


Ответы (2)


если вы читаете это, то у меня есть объяснение вашей проблемы.

  1. Если в наборе ресурсов есть какой-либо файл, то это файл ТОЛЬКО ДЛЯ ЧТЕНИЯ. Таким образом, путь вашей базы данных к каталогу ресурсов доступен только для чтения.

  2. В соответствии с кодом, который вы написали для копирования базы данных, база данных будет создана в каталоге документов вашего приложения. Этот путь не изменится, даже если вы удалите iPhone с Mac.

person Ravi Raman    schedule 28.08.2012

попробуйте это вставить в базу данных

[db open];

FMResultSet *results = [db executeQueryWithFormat:@"SELECT cms_desc FROM cms_media where cms_name=%@",@"name"];

NSString *str;

while([results next]) 

{

    str=[results stringForColumn:@"cms_desc"];
}

[results close];

[db close];

просто перетащите файл .sqlite в свой проект и перезагрузите приложение на устройстве.

person freelancer    schedule 11.04.2012
comment
Спасибо, но ты зашел слишком далеко, мой друг, слишком далеко. - person ruelluna; 11.04.2012