我在尝试在数据库中插入内容时遇到此错误:
奇怪的是,只有在我插入的表中有大约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];
}
答案 0 :(得分:3)
orderID
是什么类型的?它来自哪里?你确定它不是一个悬垂的指针吗?您只应将对象传递到executeUpdate:
。
此外,您过度释放db
。除非方法在名称中包含new
,alloc
,retain
或copy
,否则返回的任何对象都会自动释放。你不必自己发布它。
答案 1 :(得分:1)
您没有显示定义orderID
的位置,但如果它不是对象(从NSObject
派生),则会在您显示的代码中中断。如果它是一个原始整数类型,那么您需要将其包装在NSNumber
对象中,就像使用其他值一样:
[NSNumber numberWithInt:orderID]
答案 2 :(得分:0)
开启zombies,看看会发生什么。