要使用 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 上运行时,被复制的数据库位于何处?复制后,即使没有连接到我的 Mac,iPhone 是否会再次使用该数据库?
在设备上运行时我无法插入东西。请帮忙。
太感谢了!