Чтобы вставить данные в базу данных с помощью 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"]);
}
Теперь у меня есть несколько вопросов:
Код вставки отлично работал в симуляторе при выполнении/запуске. Однако это не повлияло на реальный файл sample.db, и я пришел к выводу, что он должен иметь доступную для записи копию где-то на жестком диске моего Mac. Это приемлемо. Но когда я запустил этот код на iphone, он несколько не распознал мой метод
createEditableCopyOfDatabaseIfNeeded
и выдал эту ошибку:Unknown error finalizing or resetting statement > (8: attempt to write a readonly database)
. Как заставить эти коды работать с помощью FMDB?При работе на iPhone, где будет располагаться копируемая база данных? После копирования iPhone снова использует эту базу данных, даже если он не подключен к моему Mac?
Я не могу что-то вставить при запуске на устройстве. Пожалуйста помоги.
Большое спасибо!