从sqlite3数据库删除某些行
问题描述:
我想从我的数据库中删除创建行。但它没有这样做,我有得到我的表中复制日期的具体内容,所以我要删除条目的具体日期和每次添加他们,我建立一个连接从sqlite3数据库删除某些行
我的代码是:
static sqlite3 *database = nil;
static sqlite3_stmt *deleteStmt = nil;
- (NSString *)dataFilePath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:@"person.sqlite3"];
}
NSDate *today = [NSDate date];
NSLog(@"%@", today);
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MM/dd/yy"];
if (sqlite3_open([[self dataFilePath] UTF8String], &database)
!= SQLITE_OK)
{
sqlite3_close(database);
NSAssert(0, @"Failed to open database");
}
NSString * dateString = [dateFormat stringFromDate:today];
if(deleteStmt == nil)
{
const char *sql = "delete from SHOPPER where DATE = ?";
if(sqlite3_prepare_v2(database, sql, -1, &deleteStmt, NULL) != SQLITE_OK)
NSAssert1(0, @"Error while creating delete statement. '%s'", sqlite3_errmsg(database));
}
//When binding parameters, index starts from 1 and not zero.
sqlite3_bind_text(deleteStmt, 3, [dateString UTF8String],-1, NULL);
if (SQLITE_DONE != sqlite3_step(deleteStmt))
NSAssert1(0, @"Error while deleting. '%s'", sqlite3_errmsg(database));
sqlite3_reset(deleteStmt);
sqlite3_close(database);
答
sqlite3_bind_text的第二个参数应该是1,而不是3. 它表示'?'的索引字符在准备好的声明中,并且 因为只有一个'?'在delete语句,它必须是1
//When binding parameters, index starts from 1 and not zero.
sqlite3_bind_text(deleteStmt, 1, [dateString UTF8String], -1, NULL);
那么,为什么你声明deleteStmt为静态,并创建只有一次? 我认为它应该为开放数据库创建,并且因为您每次打开 并关闭数据库,您也应该每次都创建(并确定,不重置) deleteStmt。