1

我是 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];

}

这里的“书签”是我的数据库中的表的名称,它有一个名为“pageno”的整数类型的实体。当我在查询应用程序中传递一个 int 值时,应用程序崩溃显示访问不正确。如果我传递一个字符串值,在我的日志中我得到“不是错误”,但这些值没有被插入到数据库中。我的代码有什么错误吗?

4

2 回答 2

4

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

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

FMDatabase *database = [self openDatabase];

openDatabase这个答案中定义如下:我们如何打开一个已经存在的数据库 fmdb 以及在哪里包含它?

于 2013-04-22T07:44:27.367 回答
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]);
}
于 2013-04-22T07:49:06.973 回答