FMDB插入查询已执行但未在数据库中插入数据

时间:2013-04-22 07:36:11

标签: iphone ios objective-c database sqlite

我是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值时崩溃显示访问不良。如果我传递一个字符串值,在我的日志中我得到“不是错误”,但值没有插入到数据库中。我的代码中有错误吗?

2 个答案:

答案 0 :(得分:4)

您正在尝试修改应用程序包中的数据库。捆绑包本身是只读的。为此,您必须先将数据库文件复制到文档目录,然后打开&修改它。

简而言之,将函数中的前三行替换为:

FMDatabase *database = [self openDatabase];

在此答案中定义openDatabasehow 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]);
}