插入数据库时​​FMDB EXC_BAD_ACCESS

时间:2012-05-09 15:08:21

标签: iphone objective-c fmdb

我在尝试在数据库中插入内容时遇到此错误:

fmdb error 奇怪的是,只有在我插入的表中有大约12-14个previus记录时才会出现错误。谁知道如何解决这个问题?

这是我的代码:

 - (void)addToBasket:(id)sender {
   NSArray *sysPaths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
   NSString *docDirectory = [sysPaths objectAtIndex:0];
   NSString *filePath = [NSString stringWithFormat:@"%@/MainDatabase.db", docDirectory];

   databasePath = filePath;

   db = [FMDatabase databaseWithPath:databasePath];
   if (![db open]) { [db release]; return; }

   NSInteger prodID = ((UIControl*)sender).tag;

   [db executeUpdate:@"INSERT INTO order_items VALUES (?, ?, ?, ?)", @"", [NSNumber numberWithInt:prodID], orderID, [NSNumber numberWithInt:1], nil];

   [basket insertObject:[NSNumber numberWithInt:prodID] atIndex:0];
   [basketQA insertObject:[NSNumber numberWithInt:1] atIndex:0];
   [basketItemName insertObject:@"test" atIndex:0];
   [basketPrice insertObject:@"test" atIndex:0];

   NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
   [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

   [db close];
}

3 个答案:

答案 0 :(得分:3)

orderID是什么类型的?它来自哪里?你确定它不是一个悬垂的指针吗?您只应将对象传递到executeUpdate:

此外,您过度释放db。除非方法在名称中包含newallocretaincopy,否则返回的任何对象都会自动释放。你不必自己发布它。

答案 1 :(得分:1)

您没有显示定义orderID的位置,但如果它不是对象(从NSObject派生),则会在您显示的代码中中断。如果它是一个原始整数类型,那么您需要将其包装在NSNumber对象中,就像使用其他值一样:

[NSNumber numberWithInt:orderID]

答案 2 :(得分:0)

开启zombies,看看会发生什么。