我是SQLITE数据库的新手,我正在使用FMDB。在我的应用程序中,我想将一些数据插入数据库。我使用以下代码插入数据。
-(void)insertBookmark
{
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
NSString *dbFilePath = [bundlePath stringByAppendingPathComponent:@"ISGData.sqlite"];
FMDatabase *database = [FMDatabase databaseWithPath:dbFilePath];
[database open];
[database executeUpdate:@"INSERT INTO bookmark (pageno) VALUES (?);",page, nil];
NSLog(@"%@",[database lastErrorMessage]);
[database close];
}
此处“bookmark”是我的数据库中具有名为“pageno”的实体类型为integer的实体的名称。当我在查询应用程序中传递一个int值时崩溃显示访问不良。如果我传递一个字符串值,在我的日志中我得到“不是错误”,但值没有插入到数据库中。我的代码中有错误吗?
答案 0 :(得分:4)
您正在尝试修改应用程序包中的数据库。捆绑包本身是只读的。为此,您必须先将数据库文件复制到文档目录,然后打开&修改它。
简而言之,将函数中的前三行替换为:
FMDatabase *database = [self openDatabase];
在此答案中定义openDatabase
:how do we open an already existing database fmdb and where to include it?
答案 1 :(得分:0)
汉普斯是对的。您需要将其复制到文档目录中以执行写入操作:
BOOL success;
NSError *error;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingString:@"ISGData.sqlite"];
success = [fileManager fileExistsAtPath:filePath];
if (success) return;
NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingFormat:@"ISGData.sqlite"];
success = [fileManager copyItemAtPath:path toPath:filePath error:&error];
if (!success) {
NSAssert1(0, @"Failed to copy DB. Error %@", [error localizedDescription]);
}